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:
Der Aufruf erfolgt durch diese Methode:
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.
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
- namespace MultipartFormData
- {
- public static class FileInfoExtensions
- {
- public const string HeaderTemplate = "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n";
- public static void WriteMultipartFormData(this FileInfo file, Stream stream, string mimeBoundary, string mimeType, string formKey)
- {
- string header = String.Format(HeaderTemplate, mimeBoundary, formKey, file.Name, mimeType);
- byte[] headerbytes = Encoding.UTF8.GetBytes(header);
- stream.Write(headerbytes, 0, headerbytes.Length);
- using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
- {
- byte[] buffer = new byte[1024];
- int bytesRead = 0;
- long bytesSoFar = 0;
- while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
- {
- stream.Write(buffer, 0, bytesRead); //hier erfolgt das schreiben der Datei in den Uploadstream
- bytesSoFar += buffer.Length; //die bereits geschriebenen Bytes
- System.IO.File.AppendAllText("log.txt", bytesSoFar.ToString() + " " + fileStream.Length.ToString());
- //hier scheitert es wohl, die Datei wird geschrieben aber ich bekomme am Ende keine Rückmeldung vom Server
- //der Upload geschieht ebenfalls nicht.
- }
- fileStream.Close();
- }
- byte[] newlineBytes = Encoding.UTF8.GetBytes("\r\n");
- stream.Write(newlineBytes, 0, newlineBytes.Length);
- }
- }
- }
- namespace MultipartFormData
- {
- public static class DictionaryExtensions
- {
- public const string FormDataTemplate = "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n";
- public static void WriteMultipartFormData(this Dictionary<string, string> dictionary, Stream stream, string mimeBoundary)
- {
- foreach (string key in dictionary.Keys)
- {
- string item = String.Format(FormDataTemplate, mimeBoundary, key, dictionary[key]);
- byte[] itemBytes = System.Text.Encoding.UTF8.GetBytes(item);
- stream.Write(itemBytes, 0, itemBytes.Length);
- }
- }
- }
Der Aufruf erfolgt durch diese Methode:
C#-Quellcode
- public string ExecutePostRequest(Dictionary<string, string> postData)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = "POST";
- request.KeepAlive = true;
- string boundary = GenerateBoundary();
- request.ContentType = "multipart/form-data; boundary=" + boundary;
- Stream requestStream = request.GetRequestStream();
- postData.WriteMultipartFormData(requestStream, boundary);
- if (_file != null)
- {
- _file.WriteMultipartFormData(requestStream, boundary, fileMimeType, fileFieldName);
- }
- byte[] endBytes = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "--");
- requestStream.Write(endBytes, 0, endBytes.Length);
- requestStream.Close();
- using (WebResponse response = request.GetResponse())
- using (StreamReader reader = new StreamReader(response.GetResponseStream()))
- {
- return reader.ReadToEnd();
- };
- }
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.
-Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lukas“ ()