Hallo!
Angemeldet hatte ich mich bei Euch schon vor Wochen, bisher kam ich aber mit reinem Lesen recht gut voran.
Zur Zeit versuche ich einen HTTP-Uploader hinzubekommen, der auch mit großen Dateien sauber funktioniert. Der Webclient war mir zu unflexibel, weshalb ich irgendwann beim TcpClient geladent bin.
Der angehängte Code funktioniert an sich bestens. Die Daten werden fehlerfrei übertragen und sind sogar nach der Übertragung noch les- und nutzbar
.
Durch diesen Punkt zufriedengestellt wollte ich als nächstes mit der benötigten Progressbar beginnen, wo aber die Probleme direkt anfingen.
Scheinbar wird sofort die komplette Datei in einen Zwischenpuffer geschrieben, was eine Anzeige von 0 direkt auf 100% springen lässt. An sich kein Beinbruch, aber der Puffer scheint vollständig unabhängig von C# zu sein. Normalerweise hätte ich angenommen, dass nach dem Beenden des Testprogrammes auch der Upload abbricht, aber weit gefehlt.
Selbst nach dem Abbruch läd die Datei weiter hoch, obwohl ich keinen Prozess mehr im Taskmanager sehen kann (auch nicht wenn wirklich alle eingeblendet sind). Auch das Schliessen der Express IDE oder das Ausführen als Standalone Tool bringt keine Änderung.
Weiss jemand was ich da falsch mache? Das Reduzieren des Sendepuffers bringt rein gar nichts, es scheint irgendwo direkt vom Betriebssystem eine Pufferung stattzufinden.
Vielen Dank im voraus!
Gruß,
Wolfgang
P.S.: Mir ist bewusst, dass der Code ein reines Chaos ist, aber es ist nur ein reiner Test
.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using System.Diagnostics;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string filepath = "D:\\Test\\"; string filename = "test.bin"; string hostname = "server.de";
string divider = "---------------------------24464570528145"; string header = "";
String uploadfile = "--" + divider + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"\r\n\r\n";
StringBuilder postvars = new StringBuilder("\r\n--" + divider + "\r\nContent-Disposition: form-data; name=\"field_1\"\r\n\r\ncontent_field_1\r\n"); postvars.Append("--" + divider + "\r\nContent-Disposition: form-data; name=\"field_2\"\r\n\r\ncontent_field_2\r\n"); string s = "\r\n" + divider + "--\r\n";
int filesize = (int)new FileInfo(filepath + filename).Length;
int length = uploadfile.Length + postvars.Length + s.Length + filesize; header = "POST /tmp/upload.php HTTP/1.0\r\nHost: " + hostname + "\r\nUser-Agent: NNUPloader\r\nContent-Type: multipart/form-data; boundary=" + divider + "\r\nContent-Length: " + length + "\r\n\r\n";
string input = ""; using (TcpClient client = new TcpClient()) { client.Connect(hostname, 80); client.SendBufferSize = 8192; using (NetworkStream stream = client.GetStream()) { byte[] bytes = Encoding.UTF8.GetBytes(postvars + s); byte[] buffer = Encoding.UTF8.GetBytes(header + uploadfile);
stream.Write(buffer, 0, buffer.Length);
foreach (byte b in buffer) { char singleChar = Convert.ToChar(b); Debug.Write(singleChar.ToString()); }
using (FileStream stream2 = new System.IO.FileInfo(filepath + filename).OpenRead()) { byte[] buffer3 = new byte[10000]; int count = 10000; int num6 = 0; while ((num6 = stream2.Read(buffer3, 0, count)) > 0) { stream.Write(buffer3, 0, num6); System.Console.Write("."); } stream.Write(bytes, 0, bytes.Length); foreach (byte b in bytes) { char singleChar = Convert.ToChar(b); Debug.Write(singleChar.ToString()); } input = new StreamReader(stream).ReadToEnd(); } stream.Close(); } }
System.Console.Write(input);
System.Threading.Thread.Sleep(100000);
} } } |
Moderiert von Kha: Code- durch C#-Tags ersetzt