Ich habe eine solche Anforderung in meiner Arbeit gestoßen, und ich musste mit NodeJs Dateien hochladen. Früher wusste ich nur, wie man Dateien über den Browser hochladen. Wenn ich NodeJs verwende, ist es gleichbedeutend mit der Simulation des Verhaltens des Browsers. Nach Google wurde mir klar, dass der Browser das HTTP -Protokoll einfach verwendet, um Daten an den Server zu übertragen. Das spezifische Protokoll ist "RFC 1867 - Formularbasierte Datei -Upload in HTML". Das Hochladen von Dateien über Formularformulare im Browser erfolgt über dieses Protokoll. Wir können zuerst sehen, welche Daten der Browser an den Server sendet, und dann können wir die Upload -Funktion entsprechend der Kopie implementieren. Wenn es darum geht, Dateien in Formularen hochzuladen, sollte jeder vertraut sein:
<form action = "http://www.qq.com/" method = "post"> <input type = "text" name = "text1" /> <br /> <Eingabe type = "text" name = "text2" /> <br /> <Eingabe typ
Bei der Übermittlung können Sie feststellen, dass die folgenden Daten an den Server gesendet werden, indem Fiddler zum Erfassen des Pakets verwendet wird:
Post http://www.qq.com/ http/1.1
Host: www.qq.com
Inhaltslänge: 23
Inhaltstyp: Anwendung/x-www-form-urlencoded; charset = utf-8
text1 = Hallo & text2 = Welt
Es ist erwähnenswert, dass der inhaltliche Typ standardmäßig für Anwendungen/x-www-form-urlencodiert ist, sodass die Nachricht URL-codiert wird. Zum Beispiel wird "Hallo" als%E4%BD%A0%E5%A5%BD codiert.
Schauen wir uns als nächstes an, wie das Formular hochgeladen wird. Jeder sollte vertraut sein mit:
<form action = "http://www.qqq.com" method = "post" engType = "multiPart/form-data"> <input type = "Datei" name = "myFile"/> <Eingabe typ
Erstellen Sie dann eine neue upload.txt -Textdatei mit nur der Word Hello World und laden Sie sie hoch. Wir verwenden Fiddler, um das Paket zu greifen. Wir können feststellen, dass das Senden vergangener Daten etwas komplizierter ist (viele andere nicht verwandte Anforderungsleitungen wurden entfernt, wie z. B. Cache -Steuerung und Cookies):
Post http://www.qq.com/ http/1.1
Host: www.qq.com
Inhaltslänge: 199
Content-Typ: Multipart/Form-Data; bloße = --- webkitformboundaryWr3x7sxByqq4zf5g
----- webkitformBoundaryWr3x7SXBYQQ4ZF5G
Inhaltsdisposition: Formdaten; name = "myfile"; Dateiname = "Upload.txt"
Inhaltstyp: Text/Ebene
Hallo Welt
----- webkitFormboundaryWr3x7SxByqq4zf5g--
Nach der Definition von RFC 1867 müssen wir ein Stück Grenzdaten erstellen. Diese Daten können nicht an anderer Stelle im Inhalt erscheinen. Dies kann von Ihnen selbst definiert werden. Der Erzeugungsalgorithmus jedes Browsers kann unterschiedlich sein. Die obige Grenze besteht darin, Daten zu trennen. Nach dem Generieren der getrennten Daten können die getrennten Daten in den Inhaltstyp am Kopf platziert und an den Server übertragen werden, dh dem oben genannten Inhaltstyp: Multipart/Form-Data; boundary = --- webkitFormBoundaryWr3x7SXBYQQ4ZF5G muss zusätzlich der hochgeladene Inhalt in mehrere Segmente mit separaten Daten unterteilt werden, und jedes Datensegment hat den Dateinamen und den Namen beim Hochladen. Der Server verwendet diesen Namen, um die Datei und den Dateityp-Inhaltstyp zu empfangen. In diesem Beispiel Text/Ebene. Wenn das hochgeladene PNG -Bild Bild/PNG ist, ist es Bild/PNG. Nach einer leeren Zeile des Dateityps ist auch der Inhalt der hochgeladenen Datei leicht zu verstehen. In diesem Beispiel ist die hochgeladene Textdatei so, dass der Inhalt direkt angezeigt werden kann. Wenn die hochgeladene Bilddatei eine binäre Datei ist, zeigt der Fiddler verstümmelten Code an. Nach dem Ende des Inhalts der Datei gibt es eine leere Zeile plus Grenzdaten.
Nach dem Verständnis der Details des Sendungsformats besteht der nächste Schritt darin, NodeJs zu programmieren und zu implementieren. Einfach ausgedrückt, senden Sie die Daten einfach nach dem Format an den Server.
const http = required ('http'); const fs = required ('fs'); // Die Post -Adresse ist ein PHP im lokalen Dienst, der zum Testen verwendet wird, ob der Upload erfolgreich ist. '--- webkitFormboundaryJLVKBQXTII0YGPAB'; // Lesen Sie den Dateiinhalt, der hochgeladen werden muss. 'Content-Typ: Text/Plain/R/N/R/N'; Nutzlast + = Daten; Nutzlast + = '/r/n--' + bloßekey + '-'; // Senden Sie eine Anforderung var req = http.Request (Optionen, Funktion (res) {ressetencoding ('utf8'); res.on ('data', Funktion (Chunk) {konssole ('utf8'); Chunk);});}); req.on ('error', Funktion (e) {console.Error ("Fehler:"+e);}); // Schreiben Sie die Grenze, die Größe der zu sendenden Daten und die Daten selbst in die Anforderung req.setheader ('content-type', multiPart/Formdata; bloße = '+bloßKey+' '); req.setheader (' content-Length ', buffer.ByTelength (Payload,' utf8 ')); req.write (payload); req.end ();});Der Schwerpunkt dieses Artikels liegt auf der Verständnis des Protokolls und implementieren Sie es mit Code. Es gibt immer noch viele Optimierungen in der Codeorganisation.
Schreiben Sie schließlich im lokalen Apache einen PHP, um die hochgeladene Datei als Test zu speichern:
<? php $ filepath = './Upload.txt';Move_Uploaded_file($_files?myFile'] weibliche'], $ filepath); echo "ok";?>?>?>?>
Darüber hinaus kann laut RFC 1867 die Funktion zum Aufladen mehrerer Dateien auf einmal realisiert werden. Dies wird hier nicht ausführlich beschrieben. Bei Bedarf finden Sie in RFC 1867 für eine detaillierte Implementierung.
Das obige ist das vom Editor eingeführte Node.js -Datei -Upload. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!