Httplistener und Datei-upload
Ich versuche, um eine hochgeladene Datei von meinem webserver. Wie sendet der client seine Dateien über ein Webformular (random-Dateien), muss ich zum Parsen der Anforderung, um die Datei aus und verarbeiten es weiter.
Im Grunde geht der code wie:
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
StreamReader r = new StreamReader(request.InputStream, System.Text.Encoding.Default);
//this is the retrieved file from streamreader
string file = null;
while ((line = r.ReadLine()) != null){
//i read the stream till i retrieve the filename
//get the file data out and break the loop
}
//A byststream is created by converting the string,
Byte[] bytes = request.ContentEncoding.GetBytes(file);
MemoryStream mstream = new MemoryStream(bytes);
//do the rest
Als Ergebnis bin ich in der Lage, zum abrufen von Textdateien, aber für alle anderen Dateien, sind Sie beschädigt.
Könnte mir jemand sagen, wie man analysieren diese HttplistnerRequests richtig (oder eine leicht alternative)?
Ich nehme an, Sie sind mit enctype="multipart/form-data" in Ihrem web-Formular? Wenn so wie es aussieht bist du zu kurz gedacht, den Weg Lesen Sie den Inhalt.
InformationsquelleAutor cecemel | 2011-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie machen Dinge schwieriger auf sich selbst als nötig, indem Sie diese mit einem
HttpListener
eher als mit dem eingebauten Einrichtungen ASP.Net. Aber wenn Sie es tun müssen, dieser Weg ist hier einige Beispiel-code. Hinweis: 1) ich bin davon ausgegangen, dass Sieenctype="multipart/form-data"
auf Ihre<form>
. 2) Dieser code ist entworfen, um verwendet werden, mit einer form, die nur Ihre<input type="file" />
wenn Sie buchen möchten, andere Felder oder mehrerer Dateien müssen Sie den code ändern. 3) Dies soll ein proof-of-concept/Beispiel, es können Fehler und ist nicht besonders flexibel.Zu helfen, Sie besser verstehen, was der code oben macht, hier ist das, was der Hauptteil der HTTP-POST sieht folgendermaßen aus:
Hab ich Links aus der irrelevant-Header. Wie Sie sehen können, müssen Sie analysieren den Körper durch durchsuchen zu finden, die Anfang-und Endmarkierung Sequenzen, und legen Sie die sub-Header, bevor Sie den Inhalt Ihrer Datei. Leider können Sie nicht verwenden StreamReader weil das Potenzial für Binär-Daten. Auch schade ist die Tatsache, dass es keine pro-Datei-Inhalt-Länge (Content-Length-header für die Anforderung gibt die Gesamtlänge des Körpers, einschließlich Grenzen, sub-Header und Abstand.
Hallo, vielen Dank für diesen ausgearbeiteten Antwort! Es ist in der Tat die Arbeit und hilft mir sehr! (auch wenn dies nicht der effizienteste Weg)
Das ist, was ich Suche. Danke
mein problem gelöst. Hat aber zu wenig modifizieren, wenn der stream hat keine Grenze. Vielen Dank.
Mit deinem code oben, der Ziel-Dateien, die ich übertragen haben immer 2 Byte mehr als das original. Dies spielt keine Rolle für jpg-Dateien, die Sie anzeigen noch in Ordnung, aber zip-Dateien sagen, dass die CRC nicht korrekt ist und beim entpacken, eine Datei ist immer beschädigt. Mit allen Dateien, unabhängig von Größen, ist es immer 2 zusätzliche bytes. Keine Ahnung, wo Sie herkommen? (Auf Win8.1).
InformationsquelleAutor Paul Wheeler
Das problem ist, Sie Lesen die Datei als text.
Benötigen Sie zum Lesen der Datei als bytearray statt und mit der BinaryReader ist besser und einfacher zu bedienen als
StreamReader
:Oh, das ist schade. Das problem ist, dass Sie nicht wirklich verwenden Sie das text-lese-Fähigkeiten von streamreader Extraktion einer binären Datei. Verwenden Sie ein FileUpload-Steuerelement oder einige andere Methode zum einbetten der Datei in den stream???
Das ist die treffende Bemerkung. Jetzt sind die Kunden im Grunde verwendet die Standard-html - <input type="file" name="datafile" ..> bilden. Wenn möglich, würde ich gerne vermeiden, das fileUpload-Steuerelement, um die Dinge so einfach wie möglich -wathever dies bedeutet immer noch-. In diesem Projekt, das eine andere Instanz (Maschine) sollte in der Lage sein zu werfen zufällige Dateien auf meinem server, zusammen mit einigen Metadaten, um Dinge zu tun, die mit es und die Ergebnisse posten zurück.
In diesem Fall würde ich trennen Sie den Empfang der Datei von der Bearbeitung in separate Methoden. Ich denke, der einzige Weg, den Sie gehen, um erfolgreich zu empfangen, eine binäre Datei aus, die der Benutzer verwenden Sie die eigentlichen Methoden aus der Datei input-regler. Sobald Sie die Datei erhalten haben, können Sie übergeben es an Ihre gemeinsame Datei-handling-Mechanismus.
InformationsquelleAutor competent_tech
Kann Fehler haben, testen Sie gründlich. Diese bekommt alle post -, get -, und Dateien.
InformationsquelleAutor