介紹
上篇介紹了 Upload Server上傳 的設定,主要的處理程序是透過 busboy 在處理檔案的部分 這節來來說明這一個套件
這個套件主要是在分析處理表單的資料
Busboy 建構的參數設定使用 Object 設定,有以下config可以設定:
headers - object - 這些是傳入請求的HTTP標頭,由單個解析器使用。
var busboy = new Busboy({ headers: req.headers });
highWaterMark - integer - 用於此Busboy實例的 highWaterMark(預設值:跟WritableStream 預設值一樣)。
fileHwm - integer - 用於文件流的 highWaterMark(預設值:跟ReadableStream 預設值一樣)。
defCharset - string - 預設的字符集(預設:'utf8')。
preservePath - boolean - multipart forms 的filename 將被保留路徑。(預設值:false)。
limits - object - 對輸入數據的各種限制。有效的屬性是:
*fieldNameSize - integer - 每個欄位名稱的大小(以 bytes 為單位)(預設值:100 bytes)。
*fieldSize - integer - 每個欄位最大的大小(以 bytes 為單位)(預設值:1MB)。
*fields - integer - 非文件字段的最大數目(預設值:無窮大)。
*fileSize - integer - 檔案的大小(以 bytes 為單位)(預設值:無窮大)。
*files - integer - multipart forms 檔案的數量(預設值:無窮大)。
*parts - integer - multipart forms,最大零件數量(filed+files)(預設值:無窮大)。
*headerPairs - integer - multipart forms,最大數量 header數量 =>預設值: 2000個(與 node 的http相同)。
構造函數可能會拋出錯誤:
1.不支持的內容類型:$type - Content-TypeBusboy 不能解析的內容。
2.缺少Content-Type - 提供的header不包含 Content-Type。
所以第一步一定要記得給 headers,以下是 busboy 的官方範例 有處理 file ,filed, finish 三個事件
if (req.method === 'POST') {
var busboy = new Busboy({ headers: req.headers });
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
console.log('File [' + fieldname + ']: filename: ' + filename);
file.on('data', function(data) {
console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
});
file.on('end', function() {
console.log('File [' + fieldname + '] Finished');
});
});
busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
console.log('Field [' + fieldname + ']: value: ' + inspect(val));
});
busboy.on('finish', function() {
console.log('Done parsing form!');
res.writeHead(303, { Connection: 'close', Location: '/' });
res.end();
});
req.pipe(busboy);
}
理解了 busboy 的設定檔 再來看前一篇的 apollodata的 busboy 的部分
這樣就很清楚 headers 是為了解析 multipart forms 使用,limits就可以限制一些檔案的數量與大小設定
const busboy = new Busboy({
headers: request.headers,
limits: {
fieldSize: maxFieldSize,
fields: 2, // Only operations and map
fileSize: maxFileSize,
files: maxFiles
}
})
總結
實例化一個 busboy 後就會透過 req的內容去解析表單內容物,這時候就可以透過 busboy.on 看要對filed 或是 file 再進一步的處理
busboy 套件位置
https://github.com/mscdex/busboy