2012-04-04 15 views
0

Es tut mir leid wegen des Titels, aber im Moment bin ich nicht kreativ genug, um einen besseren zu bekommen.Datei-Upload über Web-Anfrage funktioniert nicht

Ich versuche, eine Datei auf xup.in hochzuladen (um eine kleine API in C# bereitzustellen). Aber irgendwie ist die Anfrage nicht gültig. Entweder kann xup.in es lesen oder Wireshark. Die Post-Anfrage ist gültig, aber die mehrteiligen Formulardaten nicht.

Anfrage wird durch die folgende Funktion gesendet:
http://pastebin.com/AvwzxCLA (Sorry, aber ich kann nicht den Code-Tag)

Dies ist, wie ich die Anfrage erstellen: http://pastebin.com/btrg9xiZ

Kann mir jemand sagen, was ich mache ich falsch?

+1

Welche Fehler? Ausnahmen? – Oded

+0

Keine Fehler. Ich bekomme nur eine 301 zurück und wireshark kann die Daten nicht lesen. – user1312414

Antwort

0

Stab im Dunkeln - die Begrenzungszeichenfolge muss eine führende -- haben, und die letzte Zeile der Nachricht muss das folgende Format haben: --boundarystring--, andernfalls ist die Nachricht ungültig. Die MIME Entry auf Wikipedia enthält ein gutes Beispiel dafür, wie die Nachricht aussehen soll. Es ist ein guter Anfang, die Anfrage an eine Datei zu senden und sicherzustellen, dass es sich um eine gültige mehrteilige Nachricht handelt.

bearbeiten

Sie sollten wirklich die System.Net.WebClient Rahmen anstelle der Methode verwenden, die Sie verwenden. Es kapselt all diese Funktionalität ein.

Durch Ändern Ihrer Mime-Body-Konstruktion konnte ich erfolgreich aus dem Skript hochladen. Beachten Sie, dass ich die Content-Type aus den Parametern entfernt habe, da sie nicht benötigt wird. Außerdem habe ich sichergestellt, dass der boundaryString richtig gebildet wurde, dh die Zeichenfolge, die als boundaryString übergeben wurde, wurde im Anforderungsheader ohne den führenden --

verwendet

Ich machte die Funktion führen Doppel-Pflicht - es berechnet die Größe nur, wenn der Stream null ist.

public static long sendMultiPartReq(Stream req, string boundaryString, object[] files, object[] parameters) 
    { 
     String CRLF = "\r\n"; 
     byte[] b; 
     long contentLength = 0; 

     foreach (string[] file in files) 
     { 
      b = Encoding.UTF8.GetBytes(
       CRLF + "--" + boundaryString + CRLF + 
       String.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + CRLF, 
        file[0], Path.GetFileName(file[1])) + 
       "Content-Type: image/png" + CRLF + CRLF); 
      contentLength += b.LongLength; 
      if (req != null) req.Write(b, 0, b.Length); 
      if (File.Exists(file[1])) 
      { 
       b = File.ReadAllBytes(file[1]); 
       contentLength += b.LongLength; 
       if (req != null) req.Write(b, 0, b.Length); 
      } 
      b = Encoding.UTF8.GetBytes(CRLF); 
      contentLength += b.LongLength; 
      if (req != null) req.Write(b, 0, b.Length); 
     } 
     foreach (string[] parameter in parameters) 
     { 
      b = Encoding.UTF8.GetBytes(
       "--" + boundaryString + CRLF + 
       String.Format("Content-Disposition: form-data; name=\"{0}\"" + CRLF, parameter[0]) + 
       CRLF + parameter[1] + CRLF); 
      contentLength += b.LongLength; 
      if (req != null) req.Write(b, 0, b.Length); 
     } 
     b = Encoding.UTF8.GetBytes("--" + boundaryString + "--" + CRLF); 
     contentLength += b.LongLength; 
     if (req != null) req.Write(b, 0, b.Length); 
     return contentLength; 
    } 
+0

Netter Versuch, ich habe wirklich die letzte Grenze vergessen, aber das ist nicht der Fehler. Das gleiche Problem sowieso :(. Aktualisierter Code: http://pastebin.com/AvwzxCLA – user1312414

Verwandte Themen