Hier mal ein kleines Beispiel wie man mit HttpWebRequest eine Datei hochladen kann, in diesem Fall ein Bild auf epvpimg.com.
Vom Prinzip her funktioniert ein MultiPart Request eigentlich genauso wie ein normaler Request auch, man muss einfach den Post-String, welches im LiveHttpHeaders angezeigt wird, nachbilden.
Da ich hier: [Only registered and activated users can see links. Click Here To Register...] bereits ein Tutorial über WebRequest erstellt habe, werde ich in diesem Thread nicht mehr so genau darauf eingehen und alles detailiert erklären.
Die Funktion für einen Upload könnte z.B. so aussehen:
"UploadData" ist lediglich eine kleine Struktur, die unsere nötigen Werte enthält:
Und dann noch die kleine Funktion "GetContentType", die für uns überprüft, welche Dateiendung unser Bild hat und dementsprechend den nötigen Wert für unseren Request zurückgibt:
So, das einzige was wir nun noch brauchen ist unser Post-String. Dazu einfach wie im 1. Tutorial bereits erklärt, LiveHttpHeaders öffnen und ein Bild hochladen, Ergebnis:
Unsere Anfrage wird also an [Only registered and activated users can see links. Click Here To Register...] geschickt.
Die nötigen Werte für den Post-String sind:
-----------------------------114782935826962
Dies wird automatisch in der GetUploadResponse-Funktion generiert (unsere "boundary"-Variable).
Content-Disposition: form-data; name="files[]"; filename="b.jpg"
files[] -> Fieldname (in unserer UploadData-Struktur)
b.jpg -> Filename (in unserer UploadData-Struktur)
Content-Type: image/jpeg
Dies erledigt unsere GetContentType-Funktion.
So, demnach würde unser Request folgendermaßen aussehen:
Sollte unser Upload nun erfolgreich gewesen sein, so bekommen wir als Antwort folgendes (in der "html" Variable):
Ja, das war's eigentlich auch schon, im Anhang findet ihr noch ein kleines Beispielprojekt:
Hoffe ich konnte damit einigen weiterhelfen.
Kraizy
Vom Prinzip her funktioniert ein MultiPart Request eigentlich genauso wie ein normaler Request auch, man muss einfach den Post-String, welches im LiveHttpHeaders angezeigt wird, nachbilden.
Da ich hier: [Only registered and activated users can see links. Click Here To Register...] bereits ein Tutorial über WebRequest erstellt habe, werde ich in diesem Thread nicht mehr so genau darauf eingehen und alles detailiert erklären.
Die Funktion für einen Upload könnte z.B. so aussehen:
PHP Code:
Public Function GetUploadResponse(ByVal url As String, ByVal upload As UploadData) As String
Dim boundary As String = Guid.NewGuid().ToString().Replace("-", "")
Dim request As HttpWebRequest = CType(HttpWebRequest.Create(url), HttpWebRequest)
request.Method = "POST"
request.ContentType = "multipart/form-data; boundary=" & boundary
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1"
Dim PostData As New MemoryStream
With New StreamWriter(PostData)
.Write(("--" & boundary) & vbNewLine)
.Write("Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}", upload.FieldName, upload.FileName, vbNewLine)
.Write(("Content-Type: " & GetContentType(upload.FileName) & vbNewLine) & vbNewLine)
.Flush()
.Write(vbNewLine)
.Write("--{0}--{1}", boundary, vbNewLine)
PostData.Write(upload.Content, 0, upload.Content.Length)
.Flush()
End With
request.ContentLength = PostData.Length
Using s As Stream = request.GetRequestStream()
PostData.WriteTo(s)
End Using
PostData.Close()
Return New StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd()
End Function
PHP Code:
Structure UploadData
Dim Fieldname As String
Dim Filename As String
Dim Content As Byte()
Public Sub New(ByVal fieldname As String, ByVal filename As String, ByVal content As Byte())
Me.Fieldname = fieldname
Me.Filename = filename
Me.Content = content
End Sub
End Structure
PHP Code:
Public Function GetContentType(ByVal path As String) As String
Select Case New FileInfo(Path).Extension.ToLower()
Case ".bmp"
Return "image/bmp"
Case ".gif"
Return "image/gif"
Case ".jpe", ".jpeg", ".jpg"
Return "image/jpeg"
Case ".png"
Return "image/png"
Case ".svg"
Return "image/svg+xml"
Case ".tif", ".tiff"
Return "image/tiff"
Case Else
Return "application/octet-stream"
End Select
End Function
[Only registered and activated users can see links. Click Here To Register...]
Unsere Anfrage wird also an [Only registered and activated users can see links. Click Here To Register...] geschickt.
Die nötigen Werte für den Post-String sind:
-----------------------------114782935826962
Dies wird automatisch in der GetUploadResponse-Funktion generiert (unsere "boundary"-Variable).
Content-Disposition: form-data; name="files[]"; filename="b.jpg"
files[] -> Fieldname (in unserer UploadData-Struktur)
b.jpg -> Filename (in unserer UploadData-Struktur)
Content-Type: image/jpeg
Dies erledigt unsere GetContentType-Funktion.
So, demnach würde unser Request folgendermaßen aussehen:
PHP Code:
//Beim Klick auf einen Button oder sonst was...
With New Http
Dim upload As New Http.UploadData("files[]", "PfadZumBild", File.ReadAllBytes("PfadZumBild"))
Dim html As String = .GetUploadResponse("http://epvpimg.com/upload/", upload)
End With
Nun können wir z.B. ganz einfach mit der Split-Funktion (gibt natürlich auch andere Möglichkeiten) den Wert für "alphaid" auslesen und schon haben wir den Link zum Bild:Quote:
"[{"name":"b.jpg","size":35200,"type":"image\/jpeg","url":"http:\/\/epvpimg.com\/U9zFd","thumbnail_url":"http:\/\/i.epvpimg.com\/U9zFd.jpg","alphaid":"U9zFd","extension":".jpg"}]"
PHP Code:
Dim alphaid As String = html.Substring(html.IndexOf("alphaid")).Split(""""c)(2)
//alphaid hat nun den Wert U9zFd
//daraus bilden wir nun den Link
Dim url As String = "http://epvpimg.com/" & alphaid
Hoffe ich konnte damit einigen weiterhelfen.
Kraizy