1023_node.js模組--formidable
node.js模組--formidable
2016年04月24日 16:56:00 charlene程程 閱讀數:8521 標籤: node.js模組 更多
個人分類: nodeJS
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/charlene0824/article/details/51234394
formidable模組實現了上傳和編碼圖片和視訊。它支援GB級上傳資料處理,支援多種客戶端資料提交。有極高的測試覆蓋率,非常適合在生產環境中使用。
安裝方法
這是一個低版本的包,如果在開發中使用高版本的框架(如Express),formidable模組已經包含在框架中。具體用法參考:
通過npm安裝:
npm install [email protected]
- 1
formidable模組的方法和屬性
- Formidable.incomingForm()
可以通過該方法建立一個form表單
var form = new formidable.IncomingForm();
- 1
通過encoding屬性設定欄位編碼
form.encoding='utf-8';
- 1
通過uploadDir設定上傳檔案時臨時檔案存放的位置,預設上傳的臨時檔案存放的位置為os.tmpDir();
form.uploadDir='/tmp/';
- 1
通過keepExtensions屬性可以設定檔案上傳時臨時檔案的檔名是否包括副檔名。如果該值為真,即為包括副檔名,否則,就不包括副檔名。
form.keepExtensions=false;
- 1
form中存在form.type屬性,表示form表單的型別。該屬性有兩個值:mulitpart/urlencoded。該屬性的值取決於request的型別。
maxFieldsSize屬性限制了所有欄位所佔的位元組數。如果超過了該位元組數,將會報錯。預設的位元組數為2MB
form.maxFieldsSize = 2*1024*1024
- 1
maxFields屬性限制瞭解析請求欄位的的數量。預設為1000個
form.maxFields = 1000;
- 1
hash屬性可以設定md5和sha1校驗方法,預設為false(不進行校驗)
form.hash = 'md5';
- 1
parse方法解析node.js中request請求中包含的form表單提交的資料。cb為處理請求的回撥函式。
form.parse(req,function(err,fields,files){
//...
});
form.onPart(part);
- 1
- 2
- 3
- 4
- 5
如果你想根據喜好處理位元組流,你可以重寫該方法。如果重寫方法,field/file等屬性和方法將會失效,由你完全控制該程序。
form.onPart = function(part){
part.addEventListener('data',function(){
//...
});
}
- 1
- 2
- 3
- 4
- 5
如果你想用該模組自己控制特定的部分。可以按照如下方法實現。
form.onPart = function(part) {
if (!part.filename) {
// let formidable handle all non-file parts
form.handlePart(part);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- Formidable.File
file.size定義上傳檔案的位元組數。如果檔案在上傳中,該屬性表示已經寫到磁碟上的位元組數。
file.size = 0
- 1
file.path方法定義了檔案寫入的路徑(臨時路徑)。如果對該檔案路徑不滿意,可以在fileBegin時間中修改該屬性。
file.path = null
- 1
file.name儲存了檔案在客戶端中的名字
file.name = null
- 1
file.type儲存了檔案在客戶端中的mime type
file.tupe = null;
- 1
file.lastModifiedDate儲存了該檔案最後修改的日期
file.hash儲存了該檔案是否通過hash演算法進行加密,如果該值被設定,可以通過hex 獲取該變數的值
Formidable.File#toJSON()方法返回一個json格式的檔案,該檔案可以使用shiyongJSON.stringify()方法方便多請求作出響應。
- 事件
progress事件在接收到每一個解析的資料塊後觸發。可以根據該事件更新進度條
form.on('progress', function(bytesReceived, bytesExpected) {
});
- 1
- 2
field時間在接收到一個欄位鍵值對的時候觸發
form.on('field', function(name, value) {
});
- 1
- 2
fileBegin事件在一個新檔案開始上傳時觸發,如果想改變檔案上傳的路徑,可以在該事件內定義。
form.on('fileBegin', function(name, file) {
});
- 1
- 2
file事件在接收到一個檔案欄位值是觸發。file是File的例項
form.on('file', function(name, file) {
});
- 1
- 2
error在接收form表單提交的資料發生錯誤時觸發。如果請求過程中有錯誤,該請求將會自動終止。但是如果你想繼續傳送請求,可以使用request.resume()方法。
form.on('error', function(err) {
});
- 1
- 2
‘aborted’事件是當用戶中止請求時觸發,上傳時間超時或者通過socket關閉事件也可以觸發該事件。該事件觸發後,將會隨著觸發error時間
form.on('aborted', function() {
});
- 1
- 2
‘end’時間在請求完全接收後觸發,即檔案已被成功存入磁碟。通過該事件可以傳送響應
form.on('end', function() {
});
- 1
- 2
例項
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
}).listen(8080);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
注意: 在利用fs.rename(oldpath,newpath ,callback)上傳檔案的時候需要注意fs.rename()的源路徑與目錄路徑必須對應同一個磁碟,所以設定的臨時目錄也要指定在同一個磁碟下!而預設的臨時目錄為os.tmpDir(),所以需要通過form.uploadDir屬性將臨時目錄修改為和目標目錄在同一個磁碟下。