Eine Bibliothek zum Erstellen lesbarer "multipart/form-data"
-Streams. Kann zum Senden von Formularen und zum Hochladen von Dateien an andere Webanwendungen verwendet werden.
Die API dieser Bibliothek ist von der XMLHttpRequest-2 FormData-Schnittstelle inspiriert.
npm install --save form-data
In diesem Beispiel erstellen wir ein Formular mit drei Feldern, die eine Zeichenfolge, einen Puffer und einen Dateistream enthalten.
var FormData = require ( 'form-data' ) ;
var fs = require ( 'fs' ) ;
var form = new FormData ( ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , new Buffer ( 10 ) ) ;
form . append ( 'my_file' , fs . createReadStream ( '/foo/bar.jpg' ) ) ;
Sie können auch den http-Response-Stream verwenden:
var FormData = require ( 'form-data' ) ;
var http = require ( 'http' ) ;
var form = new FormData ( ) ;
http . request ( 'http://nodejs.org/images/logo.png' , function ( response ) {
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , new Buffer ( 10 ) ) ;
form . append ( 'my_logo' , response ) ;
} ) ;
Oder der Anfragestream von @mikeal:
var FormData = require ( 'form-data' ) ;
var request = require ( 'request' ) ;
var form = new FormData ( ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , new Buffer ( 10 ) ) ;
form . append ( 'my_logo' , request ( 'http://nodejs.org/images/logo.png' ) ) ;
Um dieses Formular an eine Webanwendung zu senden, rufen Sie die Methode submit(url, [callback])
auf:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Für erweiterte Anforderungsmanipulationen gibt die Methode submit()
das Objekt http.ClientRequest
zurück, oder Sie können eine der alternativen Übermittlungsmethoden auswählen.
Sie können benutzerdefinierte Optionen bereitstellen, z. B. maxDataSize
:
var FormData = require ( 'form-data' ) ;
var form = new FormData ( { maxDataSize : 20971520 } ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , /* something big */ ) ;
Eine Liste der verfügbaren Optionen finden Sie im Combined-Stream
Sie können die http-Client-Schnittstelle des Knotens verwenden:
var http = require ( 'http' ) ;
var request = http . request ( {
method : 'post' ,
host : 'example.org' ,
path : '/upload' ,
headers : form . getHeaders ( )
} ) ;
form . pipe ( request ) ;
request . on ( 'response' , function ( res ) {
console . log ( res . statusCode ) ;
} ) ;
Oder wenn Sie möchten, dass der Header 'Content-Length'
automatisch für Sie festgelegt wird:
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
So verwenden Sie benutzerdefinierte Header und vorab bekannte Längen in Teilen:
var CRLF = 'rn' ;
var form = new FormData ( ) ;
var options = {
header : CRLF + '--' + form . getBoundary ( ) + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF ,
knownLength : 1
} ;
form . append ( 'my_buffer' , buffer , options ) ;
form . submit ( 'http://example.com/' , function ( err , res ) {
if ( err ) throw err ;
console . log ( 'Done' ) ;
} ) ;
Form-Data kann alle erforderlichen Informationen aus gängigen Stream-Typen ( fs.readStream
, http.response
und mikeal's request
) erkennen und abrufen. Für einige andere Stream-Typen müssten Sie „dateibezogene“ Informationen manuell bereitstellen:
someModule . stream ( function ( err , stdout , stderr ) {
if ( err ) throw err ;
var form = new FormData ( ) ;
form . append ( 'file' , stdout , {
filename : 'unicycle.jpg' , // ... or:
filepath : 'photos/toys/unicycle.jpg' ,
contentType : 'image/jpeg' ,
knownLength : 19806
} ) ;
form . submit ( 'http://example.com/' , function ( err , res ) {
if ( err ) throw err ;
console . log ( 'Done' ) ;
} ) ;
} ) ;
Die Eigenschaft filepath
überschreibt filename
und kann einen relativen Pfad enthalten. Dies wird normalerweise verwendet, wenn mehrere Dateien aus einem Verzeichnis hochgeladen werden.
Für Randfälle, wie eine POST-Anfrage an eine URL mit einer Abfragezeichenfolge oder die Übergabe von HTTP-Authentifizierungsdaten, kann das Objekt als erster Parameter an form.submit()
übergeben werden:
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Falls Sie mit der POST-Anfrage auch benutzerdefinierte HTTP-Header senden müssen, können Sie den headers
Schlüssel im ersten Parameter von form.submit()
verwenden:
form . submit ( {
host : 'example.com' ,
path : '/surelynot.php' ,
headers : { 'x-test-header' : 'test-header-value' }
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Hängen Sie Daten an das Formular an. Sie können in jedem Format (Zeichenfolge, Ganzzahl, Boolescher Wert, Puffer usw.) einreichen. Arrays werden jedoch nicht unterstützt und müssen vom Benutzer in Strings umgewandelt werden.
var form = new FormData ( ) ;
form . append ( 'my_string' , 'my value' ) ;
form . append ( 'my_integer' , 1 ) ;
form . append ( 'my_boolean' , true ) ;
form . append ( 'my_buffer' , new Buffer ( 10 ) ) ;
form . append ( 'my_array_as_json' , JSON . stringify ( [ 'bird' , 'cute' ] ) )
Sie können eine Zeichenfolge für Optionen oder ein Objekt angeben.
// Set filename by providing a string for options
form . append ( 'my_file' , fs . createReadStream ( '/foo/bar.jpg' ) , 'bar.jpg' ) ;
// provide an object.
form . append ( 'my_file' , fs . createReadStream ( '/foo/bar.jpg' ) , { filename : 'bar.jpg' , contentType : 'image/jpeg' , knownLength : 19806 } ) ;
Diese Methode fügt dem bereitgestellten Array von userHeaders
den richtigen content-type
Header hinzu.
Gibt die Grenze der formData zurück. Standardmäßig besteht die Grenze aus 26 -
gefolgt von 24 Zahlen, zum Beispiel:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Legen Sie die Grenzzeichenfolge fest und überschreiben Sie dabei das oben beschriebene Standardverhalten.
Hinweis: Die Grenze muss eindeutig sein und darf nicht in den Daten erscheinen.
Geben Sie das vollständige Formdata-Anforderungspaket als Puffer zurück. Sie können diesen Puffer beispielsweise in Axios einfügen, um mehrteilige Daten zu senden.
var form = new FormData ( ) ;
form . append ( 'my_buffer' , Buffer . from ( [ 0x4a , 0x42 , 0x20 , 0x52 , 0x6f , 0x63 , 0x6b , 0x73 ] ) ) ;
form . append ( 'my_file' , fs . readFileSync ( '/foo/bar.jpg' ) ) ;
axios . post ( 'https://example.com/path/to/api' ,
form . getBuffer ( ) ,
form . getHeaders ( )
)
Hinweis: Da die Ausgabe vom Typ Buffer ist, können Sie nur Typen anhängen, die von Buffer akzeptiert werden: string, Buffer, ArrayBuffer, Array oder Array-like Object . Ein ReadStream führt beispielsweise zu einem Fehler.
Wie getLength
, aber synchron.
Hinweis: getLengthSync berechnet die Streamlänge nicht .
Gibt die Content-Length
asynchron zurück. Der Rückruf wird verwendet, um Fehler zu behandeln und fortzufahren, sobald die Länge berechnet wurde
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Prüft, ob die Länge der addierten Werte bekannt ist.
Senden Sie das Formular an eine Webanwendung.
var form = new FormData ( ) ;
form . append ( 'my_string' , 'Hello World' ) ;
form . submit ( 'http://example.com/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Gibt die Formulardaten als Zeichenfolge zurück. Verwenden Sie dies nicht, wenn Sie Dateien oder Puffer senden, sondern verwenden Sie stattdessen getBuffer()
.
Formulareinreichung per Anfrage:
var formData = {
my_field : 'my_value' ,
my_file : fs . createReadStream ( __dirname + '/unicycle.jpg' ) ,
} ;
request . post ( { url : 'http://service.com/upload' , formData : formData } , function ( err , httpResponse , body ) {
if ( err ) {
return console . error ( 'upload failed:' , err ) ;
}
console . log ( 'Upload successful! Server responded with:' , body ) ;
} ) ;
Weitere Einzelheiten finden Sie in der Readme-Anforderung.
Sie können ein Formular auch mit Node-Fetch senden:
var form = new FormData ( ) ;
form . append ( 'a' , 1 ) ;
fetch ( 'http://example.com' , { method : 'POST' , body : form } )
. then ( function ( res ) {
return res . json ( ) ;
} ) . then ( function ( json ) {
console . log ( json ) ;
} ) ;
In Node.js können Sie eine Datei mit Axios veröffentlichen:
const form = new FormData ( ) ;
const stream = fs . createReadStream ( PATH_TO_FILE ) ;
form . append ( 'image' , stream ) ;
// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form . getHeaders ( ) ;
axios . post ( 'http://example.com' , form , {
headers : {
... formHeaders ,
} ,
} )
. then ( response => response )
. catch ( error => error )
getLengthSync()
Methode berechnet die Länge für Streams NICHT. Verwenden Sie die Optionen knownLength
als Problemumgehung.getLength(cb)
sendet einen Fehler als ersten Parameter des Rückrufs, wenn die Stream-Länge nicht berechnet werden kann (z. B. benutzerdefinierte Streams ohne Verwendung knownLength
einsenden).submit
fügt keine content-length
hinzu, wenn die Formularlänge unbekannt oder nicht berechenbar ist.2.x
hat FormData die Unterstützung für [email protected]
eingestellt.3.x
hat FormData die Unterstützung für [email protected]
eingestellt. Form-Data wird unter der MIT-Lizenz veröffentlicht.