読み取り可能な"multipart/form-data"
ストリームを作成するライブラリ。フォームの送信や他の Web アプリケーションへのファイルのアップロードに使用できます。
このライブラリの API は、XMLHttpRequest-2 FormData インターフェイスからインスピレーションを得ています。
npm install --save form-data
この例では、文字列、バッファー、ファイル ストリームを含む 3 つのフィールドを持つフォームを構築しています。
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-response ストリームを使用することもできます。
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' ) ) ;
このフォームを Web アプリケーションに送信するには、 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 */ ) ;
利用可能なオプションのリストは、combined-stream にあります。
ノードの 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
をオーバーライドし、相対パスを含めることができます。これは通常、ディレクトリから複数のファイルをアップロードするときに使用されます。
クエリ文字列を含む URL への POST リクエストや HTTP 認証資格情報を渡すなどのエッジ ケースの場合は、オブジェクトを最初のパラメータとしてform.submit()
に渡すことができます。
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
POST リクエストでカスタム HTTP ヘッダーも送信する必要がある場合は、 form.submit()
の最初のパラメーターでheaders
キーを使用できます。
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 } ) ;
このメソッドは、提供されたuserHeaders
の配列に正しいcontent-type
ヘッダーを追加します。
formData の境界を返します。デフォルトでは、境界は 26 で構成され-
その後に 24 の数値が続きます。例:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
境界文字列を設定して、上記のデフォルトの動作をオーバーライドします。
注: 境界は一意である必要があり、データに表示されない場合があります。
完全な formdata 要求パッケージをバッファとして返します。このバッファを 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 ) ) ;
加算された値の長さが既知であるかどうかを確認します。
フォームを 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 ( ) ;
} ) ;
フォームデータを文字列として返します。ファイルまたはバッファを送信する場合はこれを使用せず、代わりに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 リクエストを参照してください。
ノードフェッチを使用してフォームを送信することもできます。
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 ライセンスに基づいてリリースされています。