Une bibliothèque pour créer des flux "multipart/form-data"
lisibles. Peut être utilisé pour soumettre des formulaires et des téléchargements de fichiers vers d’autres applications Web.
L'API de cette bibliothèque est inspirée de l'interface XMLHttpRequest-2 FormData.
npm install --save form-data
Dans cet exemple, nous construisons un formulaire avec 3 champs contenant une chaîne, un tampon et un flux de fichiers.
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' ) ) ;
Vous pouvez également utiliser le flux de réponse http :
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 ) ;
} ) ;
Ou le flux de requêtes de @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' ) ) ;
Afin de soumettre ce formulaire à une application Web, appelez la méthode submit(url, [callback])
:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Pour des manipulations de requêtes plus avancées, la méthode submit()
renvoie l'objet http.ClientRequest
, ou vous pouvez choisir parmi l'une des méthodes de soumission alternatives.
Vous pouvez fournir des options personnalisées, telles que maxDataSize
:
var FormData = require ( 'form-data' ) ;
var form = new FormData ( { maxDataSize : 20971520 } ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , /* something big */ ) ;
La liste des options disponibles peut être trouvée dans le flux combiné
Vous pouvez utiliser l'interface client http du nœud :
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 ) ;
} ) ;
Ou si vous préférez que l'en-tête 'Content-Length'
soit défini pour vous :
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Pour utiliser des en-têtes personnalisés et une longueur pré-connue dans les parties :
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 peut reconnaître et récupérer toutes les informations requises à partir des types courants de flux ( fs.readStream
, http.response
et mikeal's request
), pour certains autres types de flux, vous devrez fournir manuellement les informations relatives au "fichier" :
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' ) ;
} ) ;
} ) ;
La propriété filepath
remplace filename
et peut contenir un chemin relatif. Ceci est généralement utilisé lors du téléchargement de plusieurs fichiers à partir d'un répertoire.
Pour les cas extrêmes, comme la requête POST vers une URL avec une chaîne de requête ou pour transmettre les informations d'identification d'authentification HTTP, l'objet peut être transmis à form.submit()
comme premier paramètre :
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Si vous devez également envoyer des en-têtes HTTP personnalisés avec la requête POST, vous pouvez utiliser la clé headers
dans le premier paramètre de form.submit()
:
form . submit ( {
host : 'example.com' ,
path : '/surelynot.php' ,
headers : { 'x-test-header' : 'test-header-value' }
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Ajoutez des données au formulaire. Vous pouvez soumettre n'importe quel format (chaîne, entier, booléen, tampon, etc.). Cependant, les tableaux ne sont pas pris en charge et doivent être transformés en chaînes par l'utilisateur.
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' ] ) )
Vous pouvez fournir une chaîne pour les options ou un objet.
// 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 } ) ;
Cette méthode ajoute l’en-tête content-type
correct au tableau fourni de userHeaders
.
Renvoie la limite du formData. Par défaut, la limite est composée de 26 -
suivis de 24 nombres par exemple :
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Définissez la chaîne de limite, en remplaçant le comportement par défaut décrit ci-dessus.
Remarque : La limite doit être unique et peut ne pas apparaître dans les données.
Renvoie le package complet de demande de données de formulaire, sous forme de tampon. Vous pouvez insérer ce tampon dans par exemple Axios pour envoyer des données en plusieurs parties.
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 ( )
)
Remarque : étant donné que la sortie est de type Buffer, vous ne pouvez ajouter que des types acceptés par Buffer : string, Buffer, ArrayBuffer, Array ou Array-like Object . Un ReadStream par exemple entraînera une erreur.
Identique à getLength
mais synchrone.
Remarque : getLengthSync ne calcule pas la longueur des flux.
Renvoie l'asynchrone Content-Length
. Le rappel est utilisé pour gérer les erreurs et continue une fois la longueur calculée
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Vérifie si la longueur des valeurs ajoutées est connue.
Soumettez le formulaire à une application Web.
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 ( ) ;
} ) ;
Renvoie les données du formulaire sous forme de chaîne. N'utilisez pas ceci si vous envoyez des fichiers ou des tampons, utilisez plutôt getBuffer()
.
Soumission du formulaire à l'aide d'une demande :
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 ) ;
} ) ;
Pour plus de détails, voir la demande readme.
Vous pouvez également soumettre un formulaire en utilisant node-fetch :
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 ) ;
} ) ;
Dans Node.js, vous pouvez publier un fichier en utilisant axios :
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()
NE calcule PAS la longueur des flux, utilisez les options knownLength
comme solution de contournement.getLength(cb)
enverra une erreur comme premier paramètre de rappel si la longueur du flux ne peut pas être calculée (par exemple, envoyer des flux personnalisés sans utiliser knownLength
).submit
n'ajoutera pas content-length
si la longueur du formulaire est inconnue ou non calculable.2.x
FormData a abandonné la prise en charge de [email protected]
.3.x
FormData a abandonné la prise en charge de [email protected]
. Form-Data est publié sous la licence MIT.