ไลบรารีสำหรับสร้างสตรีม "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:
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
และอาจมีเส้นทางสัมพัทธ์ โดยทั่วไปจะใช้เมื่ออัปโหลดหลายไฟล์จากไดเร็กทอรี
สำหรับกรณี Edge เช่น คำขอ 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 แบบเต็มเป็นบัฟเฟอร์ คุณสามารถแทรกบัฟเฟอร์นี้ใน เช่น 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 จะไม่ คำนวณความยาวของสตรีม
ส่งกลับค่า async 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