Uma biblioteca para criar fluxos "multipart/form-data"
legíveis. Pode ser usado para enviar formulários e uploads de arquivos para outros aplicativos da web.
A API desta biblioteca é inspirada na interface XMLHttpRequest-2 FormData.
npm install --save form-data
Neste exemplo estamos construindo um formulário com 3 campos que contém uma string, um buffer e um fluxo de arquivo.
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' ) ) ;
Além disso, você pode usar o fluxo de resposta 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 o fluxo de solicitação 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 formulário para uma aplicação web, chame o método submit(url, [callback])
:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Para manipulações de solicitação mais avançadas, o método submit()
retorna o objeto http.ClientRequest
, ou você pode escolher um dos métodos de envio alternativos.
Você pode fornecer opções 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 */ ) ;
A lista de opções disponíveis pode ser encontrada em fluxo combinado
Você pode usar a interface do cliente http do nó:
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 se preferir que o cabeçalho 'Content-Length'
seja definido para você:
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Para usar cabeçalhos personalizados e comprimentos pré-conhecidos em peças:
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 pode reconhecer e buscar todas as informações necessárias de tipos comuns de fluxos ( fs.readStream
, http.response
e mikeal's request
), para alguns outros tipos de fluxos você precisaria fornecer informações relacionadas ao "arquivo" 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' ) ;
} ) ;
} ) ;
A propriedade filepath
substitui filename
e pode conter um caminho relativo. Isso normalmente é usado ao fazer upload de vários arquivos de um diretório.
Para casos extremos, como solicitação POST para URL com string de consulta ou para passar credenciais de autenticação HTTP, o objeto pode ser passado para form.submit()
como primeiro parâmetro:
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Caso você também precise enviar cabeçalhos HTTP personalizados com a solicitação POST, você pode usar a chave headers
no primeiro 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 ) ;
} ) ;
Anexe dados ao formulário. Você pode enviar qualquer formato (string, inteiro, booleano, buffer, etc.). Porém, Arrays não são suportados e precisam ser transformados em strings pelo usuário.
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' ] ) )
Você pode fornecer uma string para opções ou um 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 adiciona o cabeçalho content-type
correto à matriz fornecida de userHeaders
.
Retorne o limite do formData. Por padrão, o limite consiste em 26 -
seguido por 24 números, por exemplo:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Defina a string limite, substituindo o comportamento padrão descrito acima.
Nota: O limite deve ser exclusivo e pode não aparecer nos dados.
Retorne o pacote completo de solicitação de dados de formulário, como um Buffer. Você pode inserir este buffer, por exemplo, no Axios para enviar dados multipartes.
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: Como a saída é do tipo Buffer, você só pode anexar tipos aceitos pelo Buffer: string, Buffer, ArrayBuffer, Array ou Array-like Object . Um ReadStream, por exemplo, resultará em um erro.
O mesmo que getLength
, mas síncrono.
Nota: getLengthSync não calcula o comprimento dos streams.
Retorna o Content-Length
assíncrono. O retorno de chamada é usado para lidar com erros e continuar depois que o comprimento for calculado
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Verifica se o comprimento dos valores adicionados é conhecido.
Envie o formulário para um aplicativo da 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 ( ) ;
} ) ;
Retorna os dados do formulário como uma string. Não use isso se estiver enviando arquivos ou buffers; em vez disso, use getBuffer()
.
Envio de formulário usando solicitação:
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 obter mais detalhes, consulte o leia-me da solicitação.
Você também pode enviar um formulário 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 ) ;
} ) ;
No Node.js você pode postar um arquivo 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()
NÃO calcula o comprimento dos fluxos, use as opções knownLength
como solução alternativa.getLength(cb)
enviará um erro como primeiro parâmetro de retorno de chamada se o comprimento do stream não puder ser calculado (por exemplo, enviar streams personalizados sem knownLength
).submit
não adicionará content-length
se o comprimento do formulário for desconhecido ou não calculável.2.x
FormData abandonou o suporte para [email protected]
.3.x
FormData abandonou o suporte para [email protected]
. Form-Data é lançado sob a licença do MIT.