Una biblioteca para crear flujos legibles "multipart/form-data"
. Se puede utilizar para enviar formularios y cargar archivos a otras aplicaciones web.
La API de esta biblioteca está inspirada en la interfaz XMLHttpRequest-2 FormData.
npm install --save form-data
En este ejemplo, estamos construyendo un formulario con 3 campos que contienen una cadena, un búfer y una secuencia de archivos.
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' ) ) ;
También puedes usar la secuencia de respuesta 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 ) ;
} ) ;
O el flujo de solicitudes 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' ) ) ;
Para enviar este formulario a una aplicación web, llame al método submit(url, [callback])
:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Para manipulaciones de solicitudes más avanzadas, el método submit()
devuelve el objeto http.ClientRequest
, o puede elegir uno de los métodos de envío alternativos.
Puede proporcionar opciones personalizadas, como 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 lista de opciones disponibles se puede encontrar en flujo combinado
Puede utilizar la interfaz del cliente http del nodo:
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 ) ;
} ) ;
O si prefiere que se configure el encabezado 'Content-Length'
:
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Para utilizar encabezados personalizados y longitudes conocidas previamente en partes:
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 puede reconocer y recuperar toda la información requerida de tipos comunes de transmisiones ( fs.readStream
, http.response
y mikeal's request
), para algunos otros tipos de transmisiones necesitará proporcionar información relacionada con el "archivo" manualmente:
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 propiedad filepath
anula filename
y puede contener una ruta relativa. Esto se utiliza normalmente al cargar varios archivos desde un directorio.
Para casos extremos, como una solicitud POST a una URL con una cadena de consulta o para pasar credenciales de autenticación HTTP, el objeto se puede pasar a form.submit()
como primer parámetro:
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
En caso de que necesite enviar también encabezados HTTP personalizados con la solicitud POST, puede usar la clave headers
en el primer parámetro 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 ) ;
} ) ;
Agregar datos al formulario. Puede enviar cualquier formato (cadena, entero, booleano, búfer, etc.). Sin embargo, las matrices no son compatibles y el usuario debe convertirlas en cadenas.
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' ] ) )
Puede proporcionar una cadena para opciones o un objeto.
// 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 } ) ;
Este método agrega el encabezado content-type
correcto a la matriz proporcionada de userHeaders
.
Devuelve el límite de formData. De forma predeterminada, el límite consta de 26 -
seguidos de 24 números, por ejemplo:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Establezca la cadena de límite, anulando el comportamiento predeterminado descrito anteriormente.
Nota: El límite debe ser único y no puede aparecer en los datos.
Devuelve el paquete de solicitud de datos de formulario completo, como un búfer. Puede insertar este búfer, por ejemplo, en Axios para enviar datos de varias partes.
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 ( )
)
Nota: Debido a que la salida es de tipo Buffer, solo puede agregar tipos que sean aceptados por Buffer: cadena, Buffer, ArrayBuffer, Array u Objeto similar a una matriz . Un ReadStream, por ejemplo, generará un error.
Igual que getLength
pero sincrónico.
Nota: getLengthSync no calcula la duración de las transmisiones.
Devuelve el valor asíncrono Content-Length
. La devolución de llamada se utiliza para manejar errores y continuar una vez que se ha calculado la longitud.
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Comprueba si se conoce la longitud de los valores agregados.
Envíe el formulario a una aplicación 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 ( ) ;
} ) ;
Devuelve los datos del formulario como una cadena. No uses esto si estás enviando archivos o buffers, usa getBuffer()
en su lugar.
Envío de formulario mediante solicitud:
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 ) ;
} ) ;
Para obtener más detalles, consulte la solicitud Léame.
También puedes enviar un formulario usando 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 ) ;
} ) ;
En Node.js puedes publicar un archivo usando 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()
NO calcula la longitud de las transmisiones; utilice las opciones de longitud knownLength
como solución alternativa.getLength(cb)
enviará un error como primer parámetro de la devolución de llamada si no se puede calcular la longitud de la transmisión (por ejemplo, enviar transmisiones personalizadas sin knownLength
).submit
no agregará content-length
si la longitud del formulario es desconocida o no es calculable.2.x
FormData dejó de admitir [email protected]
.3.x
FormData dejó de admitir [email protected]
. Form-Data se publica bajo la licencia MIT.