Библиотека для создания читаемых потоков "multipart/form-data"
. Может использоваться для отправки форм и загрузки файлов в другие веб-приложения.
API этой библиотеки основан на интерфейсе FormData XMLHttpRequest-2.
npm install --save form-data
В этом примере мы создаем форму с тремя полями, содержащими строку, буфер и файловый поток.
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' ) ) ;
Также вы можете использовать поток 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 ) ;
} ) ;
Или поток запросов @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' ) ) ;
Чтобы отправить эту форму в веб-приложение, вызовите метод submit(url, [callback])
:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Для более сложных манипуляций с запросами метод submit()
возвращает объект http.ClientRequest
, или вы можете выбрать один из альтернативных методов отправки.
Вы можете предоставить собственные параметры, такие как maxDataSize
:
var FormData = require ( 'form-data' ) ;
var form = new FormData ( { maxDataSize : 20971520 } ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , /* something big */ ) ;
Список доступных опций можно найти в объединенном потоке.
Вы можете использовать HTTP-клиентский интерфейс узла:
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 ) ;
} ) ;
Или, если вы предпочитаете, чтобы заголовок 'Content-Length'
был установлен для вас:
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Чтобы использовать пользовательские заголовки и заранее известную длину по частям:
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 может распознавать и извлекать всю необходимую информацию из распространенных типов потоков ( fs.readStream
, http.response
и mikeal's request
), для некоторых других типов потоков вам придется предоставить информацию, связанную с файлом, вручную:
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' ) ;
} ) ;
} ) ;
Свойство filepath
переопределяет filename
и может содержать относительный путь. Обычно это используется при загрузке нескольких файлов из каталога.
В пограничных случаях, таких как POST-запрос к URL-адресу со строкой запроса или для передачи учетных данных HTTP-аутентификации, объект можно передать в form.submit()
в качестве первого параметра:
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Если вам также необходимо отправить пользовательские заголовки HTTP с запросом POST, вы можете использовать ключ headers
в первом параметре form.submit()
:
form . submit ( {
host : 'example.com' ,
path : '/surelynot.php' ,
headers : { 'x-test-header' : 'test-header-value' }
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Добавьте данные в форму. Вы можете отправлять данные в любом формате (строка, целое число, логическое значение, буфер и т. д.). Однако массивы не поддерживаются, и пользователю необходимо преобразовать их в строки.
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' ] ) )
Вы можете указать строку для параметров или объект.
// 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 } ) ;
Этот метод добавляет правильный заголовок content-type
в предоставленный массив userHeaders
.
Верните границу formData. По умолчанию граница состоит из 26 -
за которыми следуют, например, 24 цифры:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Установите граничную строку, переопределив поведение по умолчанию, описанное выше.
Примечание. Граница должна быть уникальной и может не отображаться в данных.
Верните полный пакет запроса formdata в виде Buffer. Вы можете вставить этот буфер, например, в Axios для отправки составных данных.
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 ( )
)
Примечание. Поскольку выходные данные имеют тип Buffer, вы можете добавлять только те типы, которые принимаются Buffer: string, Buffer, ArrayBuffer, Array или Array-like Object . Например, ReadStream приведет к ошибке.
То же, что и getLength
, но синхронно.
Примечание. getLengthSync не рассчитывает длину потоков.
Возвращает асинхронное значение Content-Length
. Обратный вызов используется для обработки ошибок и продолжения после расчета длины.
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Проверяет, известна ли длина добавляемых значений.
Отправьте форму в веб-приложение.
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 ( ) ;
} ) ;
Возвращает данные формы в виде строки. Не используйте это, если вы отправляете файлы или буферы, вместо этого используйте getBuffer()
.
Отправка формы с использованием запроса:
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 ) ;
} ) ;
Более подробную информацию см. в файле readme запроса.
Вы также можете отправить форму с помощью 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 ) ;
} ) ;
В Node.js вы можете опубликовать файл с помощью 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()
НЕ рассчитывает длину потоков, в качестве обходного пути используйте knownLength
.getLength(cb)
отправит ошибку в качестве первого параметра обратного вызова, если длину потока невозможно вычислить (например, отправить пользовательские потоки без knownLength
).submit
не будет добавлять content-length
, если длина формы неизвестна или не поддается вычислению.2.x
FormData прекратила поддержку [email protected]
.3.x
FormData прекратила поддержку [email protected]
. Form-Data выпускается под лицензией MIT.