WebRequest: POST Parameter mit anschließendem Upload; Fortschritt ausgeben

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    WebRequest: POST Parameter mit anschließendem Upload; Fortschritt ausgeben

    Hi,

    ich arbeite derzeit an einem Dateiupload in C#. Die PHP-Datei auf dem Server benötigt zunächst POST-Parameter, in denen einige Dateidetails übergeben werden, aber das ist von nicht all zu großer Bedeutung. Es geht eher um die Datei selbst. Der Code, den ich derzeit habe, funktioniert soweit ganz gut. Sobald ich aber versuche, den Fortschritt auf irgendeine Weise mitzuschreiben, sei es per IO.File.AppendAllText oder in einer Konsolenanwendung per WriteLine, kriege ich keine Rückmeldung mehr vom Server. Laut Ausgabe wird aber alles gesendet.

    Hier der Code:

    C#-Quellcode

    1. namespace MultipartFormData
    2. {
    3. public static class FileInfoExtensions
    4. {
    5. public const string HeaderTemplate = "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n";
    6. public static void WriteMultipartFormData(this FileInfo file, Stream stream, string mimeBoundary, string mimeType, string formKey)
    7. {
    8. string header = String.Format(HeaderTemplate, mimeBoundary, formKey, file.Name, mimeType);
    9. byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    10. stream.Write(headerbytes, 0, headerbytes.Length);
    11. using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
    12. {
    13. byte[] buffer = new byte[1024];
    14. int bytesRead = 0;
    15. long bytesSoFar = 0;
    16. while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    17. {
    18. stream.Write(buffer, 0, bytesRead); //hier erfolgt das schreiben der Datei in den Uploadstream
    19. bytesSoFar += buffer.Length; //die bereits geschriebenen Bytes
    20. System.IO.File.AppendAllText("log.txt", bytesSoFar.ToString() + " " + fileStream.Length.ToString());
    21. //hier scheitert es wohl, die Datei wird geschrieben aber ich bekomme am Ende keine Rückmeldung vom Server
    22. //der Upload geschieht ebenfalls nicht.
    23. }
    24. fileStream.Close();
    25. }
    26. byte[] newlineBytes = Encoding.UTF8.GetBytes("\r\n");
    27. stream.Write(newlineBytes, 0, newlineBytes.Length);
    28. }
    29. }
    30. }
    31. namespace MultipartFormData
    32. {
    33. public static class DictionaryExtensions
    34. {
    35. public const string FormDataTemplate = "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n";
    36. public static void WriteMultipartFormData(this Dictionary<string, string> dictionary, Stream stream, string mimeBoundary)
    37. {
    38. foreach (string key in dictionary.Keys)
    39. {
    40. string item = String.Format(FormDataTemplate, mimeBoundary, key, dictionary[key]);
    41. byte[] itemBytes = System.Text.Encoding.UTF8.GetBytes(item);
    42. stream.Write(itemBytes, 0, itemBytes.Length);
    43. }
    44. }
    45. }


    Der Aufruf erfolgt durch diese Methode:

    C#-Quellcode

    1. public string ExecutePostRequest(Dictionary<string, string> postData)
    2. {
    3. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    4. request.Method = "POST";
    5. request.KeepAlive = true;
    6. string boundary = GenerateBoundary();
    7. request.ContentType = "multipart/form-data; boundary=" + boundary;
    8. Stream requestStream = request.GetRequestStream();
    9. postData.WriteMultipartFormData(requestStream, boundary);
    10. if (_file != null)
    11. {
    12. _file.WriteMultipartFormData(requestStream, boundary, fileMimeType, fileFieldName);
    13. }
    14. byte[] endBytes = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "--");
    15. requestStream.Write(endBytes, 0, endBytes.Length);
    16. requestStream.Close();
    17. using (WebResponse response = request.GetResponse())
    18. using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    19. {
    20. return reader.ReadToEnd();
    21. };
    22. }

    PostData ist ein Dictionary mit den POST-Werten, _file eine FileInfo der Datei, die hochgeladen werden soll. Diese ist bereits vorher gesetzt und soweit korrekt.

    Der Code stammt übrigens von hier: paraesthesia.com/archive/2009/…sing-.net-webrequest.aspx

    Falls mehr Code von Nöten ist, sagt bescheid.

    mfg,
    Lukas

    EDIT: Nach dem Schreiben eines weiteren Wrappers bestand der Fehler wohl darin, das .SendChunked auf false war.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lukas“ ()

    musst den webrequest mit withevents deklarieren und dann seine events nutzen, sollte gehn ^^

    nevermind, gibts ja ned in c#

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()