읽을 수 있는 "multipart/form-data"
스트림을 생성하는 라이브러리입니다. 다른 웹 애플리케이션에 양식을 제출하고 파일을 업로드하는 데 사용할 수 있습니다.
이 라이브러리의 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' ) ) ;
이 양식을 웹 애플리케이션에 제출하려면 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
재정의하며 상대 경로를 포함할 수 있습니다. 이는 일반적으로 디렉터리에서 여러 파일을 업로드할 때 사용됩니다.
쿼리 문자열을 사용하여 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
위에서 설명한 기본 동작을 재정의하여 경계 문자열을 설정합니다.
참고: 경계는 고유해야 하며 데이터에 나타나지 않을 수 있습니다.
전체 양식 데이터 요청 패키지를 버퍼로 반환합니다. 이 버퍼를 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 라이센스에 따라 공개됩니다.