Pustaka untuk membuat aliran "multipart/form-data"
yang dapat dibaca. Dapat digunakan untuk mengirimkan formulir dan mengunggah file ke aplikasi web lain.
API perpustakaan ini terinspirasi oleh Antarmuka FormData XMLHttpRequest-2.
npm install --save form-data
Dalam contoh ini kita membuat formulir dengan 3 bidang yang berisi string, buffer, dan aliran file.
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' ) ) ;
Anda juga dapat menggunakan aliran respons 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 ) ;
} ) ;
Atau aliran permintaan @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' ) ) ;
Untuk mengirimkan formulir ini ke aplikasi web, panggil metode submit(url, [callback])
:
form . submit ( 'http://example.org/' , function ( err , res ) {
// res – response object (http.IncomingMessage) //
res . resume ( ) ;
} ) ;
Untuk manipulasi permintaan lebih lanjut, metode submit()
akan mengembalikan objek http.ClientRequest
, atau Anda dapat memilih salah satu metode pengiriman alternatif.
Anda dapat memberikan opsi khusus, seperti maxDataSize
:
var FormData = require ( 'form-data' ) ;
var form = new FormData ( { maxDataSize : 20971520 } ) ;
form . append ( 'my_field' , 'my value' ) ;
form . append ( 'my_buffer' , /* something big */ ) ;
Daftar opsi yang tersedia dapat ditemukan di aliran gabungan
Anda dapat menggunakan antarmuka klien http simpul:
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 ) ;
} ) ;
Atau jika Anda lebih suka tajuk 'Content-Length'
disetel untuk Anda:
form . submit ( 'example.org/upload' , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Untuk menggunakan header khusus dan panjang yang diketahui sebelumnya di beberapa bagian:
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 dapat mengenali dan mengambil semua informasi yang diperlukan dari jenis aliran umum ( fs.readStream
, http.response
dan mikeal's request
), untuk beberapa jenis aliran lainnya Anda perlu memberikan informasi terkait "file" secara manual:
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' ) ;
} ) ;
} ) ;
Properti filepath
menggantikan filename
dan mungkin berisi jalur relatif. Ini biasanya digunakan ketika mengunggah banyak file dari sebuah direktori.
Untuk kasus edge, seperti permintaan POST ke URL dengan string kueri atau untuk meneruskan kredensial autentikasi HTTP, objek dapat diteruskan ke form.submit()
sebagai parameter pertama:
form . submit ( {
host : 'example.com' ,
path : '/probably.php?extra=params' ,
auth : 'username:password'
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Jika Anda juga perlu mengirim header HTTP khusus dengan permintaan POST, Anda dapat menggunakan kunci headers
di parameter pertama form.submit()
:
form . submit ( {
host : 'example.com' ,
path : '/surelynot.php' ,
headers : { 'x-test-header' : 'test-header-value' }
} , function ( err , res ) {
console . log ( res . statusCode ) ;
} ) ;
Tambahkan data ke formulir. Anda dapat mengirimkan dalam format apa pun (string, integer, boolean, buffer, dll.). Namun, Array tidak didukung dan perlu diubah menjadi string oleh pengguna.
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' ] ) )
Anda dapat memberikan string untuk opsi, atau objek.
// 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 } ) ;
Metode ini menambahkan header content-type
yang benar ke array userHeaders
yang disediakan.
Kembalikan batas formData. Secara default, batasnya terdiri dari 26 -
diikuti 24 angka, misalnya:
-- -- -- -- -- -- -- -- -- -- -- -- -- 515890814546601021194782
Tetapkan string batas, dengan mengesampingkan perilaku default yang dijelaskan di atas.
Catatan: Batasnya harus unik dan tidak boleh muncul di data.
Mengembalikan paket permintaan formdata lengkap, sebagai Buffer. Anda dapat memasukkan Buffer ini misalnya Axios untuk mengirim data multi-bagian.
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 ( )
)
Catatan: Karena keluarannya bertipe Buffer, Anda hanya dapat menambahkan tipe yang diterima oleh Buffer: string, Buffer, ArrayBuffer, Array, atau Array-like Object . ReadStream misalnya akan menghasilkan kesalahan.
Sama seperti getLength
tetapi sinkron.
Catatan: getLengthSync tidak menghitung panjang streaming.
Mengembalikan asinkron Content-Length
. Callback digunakan untuk menangani kesalahan dan melanjutkan setelah panjangnya dihitung
this . getLength ( function ( err , length ) {
if ( err ) {
this . _error ( err ) ;
return ;
}
// add content length
request . setHeader ( 'Content-Length' , length ) ;
...
} . bind ( this ) ) ;
Memeriksa apakah panjang nilai tambah diketahui.
Kirimkan formulir ke aplikasi 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 ( ) ;
} ) ;
Mengembalikan data formulir sebagai string. Jangan gunakan ini jika Anda mengirim file atau buffer, gunakan getBuffer()
sebagai gantinya.
Pengiriman formulir menggunakan permintaan:
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 ) ;
} ) ;
Untuk lebih jelasnya lihat permintaan readme.
Anda juga dapat mengirimkan formulir menggunakan pengambilan simpul:
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 ) ;
} ) ;
Di Node.js Anda dapat memposting file menggunakan aksio:
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()
TIDAK menghitung panjang aliran, gunakan opsi knownLength
sebagai solusinya.getLength(cb)
akan mengirimkan kesalahan sebagai parameter panggilan balik pertama jika panjang aliran tidak dapat dihitung (misalnya mengirimkan aliran khusus tanpa menggunakan knownLength
).submit
tidak akan menambah content-length
jika panjang formulir tidak diketahui atau tidak dapat dihitung.2.x
FormData telah menghentikan dukungan untuk [email protected]
.3.x
FormData telah menghentikan dukungan untuk [email protected]
. Form-Data dirilis di bawah lisensi MIT.