1. 程式人生 > >1023_node.js模組--formidable

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屬性將臨時目錄修改為和目標目錄在同一個磁碟下。