node.js Form 表單數據處理 簡單教程 formidable 使用心得

入門,高手見笑 表單數據一種是get方式, 另外一種是post 方式 #1.get方式 對於get方式,node處理起來很是簡單 如如下代碼:node

var urlParsed = url.parse(request.url);
var getData = querystring.parse(urlParsed.query); 
//getData 爲object類型 同名表單爲array
get返回結果:
{
    name: "blue5tar",
    hobby:["read", "surfing"]
}

#2. post方式 post方式處理起來比較麻煩,可是有了node-formidable 這個module 咱們就省事多了 使用npm安裝 node-formidablenpm

npm install formidable

formidable 使用方法app

formidable = require("formidable"); //載入 formidable

var form = new formidable.IncomingForm(); 
var post = {},
     file = {};
form.uploadDir = '/tmp';  //文件上傳 臨時文件存放路徑 

form
    .on('error', function(err) {
        console.log(err); //各類錯誤
    })
     //POST 普通數據 不包含文件 field 表單name value 表單value 
    .on('field', function(field, value) { 
        if (form.type == 'multipart') {  //有文件上傳時 enctype="multipart/form-data" 
            if (field in post) { //同名表單 checkbox 返回array 同get處理
                if (util.isArray(post[field]) === false) {
                    post[field] = [post[field]];
                }
                post[field].push(value);
                return;
            }
        }
        post[field] = value;
    })
    .on('file', function(field, file) { //上傳文件
        file[field] = file;
    })
    .on('end', function() {
        fn(); //解析完畢 作其餘work
    });
form.parse(request); //解析request對象

post方式有個bug 當form 有enctype="multipart/form-data" 和沒有 enctype="multipart/form-data" 時 同名表單處理的方式不同。 有 enctype="multipart/form-data" 時 同名表單會被最後一個value覆蓋, 沒有 enctype="multipart/form-data"時,同get同樣 會返回一個array 因此, 在 'field'事件時,對form.type進行不一樣處理 , 同名表單都返回array 還有一個問題,上傳文件時 若是不選擇文件 也會在臨時目錄生成空的臨時文件, 解決辦法: 修改 formidable 模塊 lib/incoming_form.js handlePart方法 在183行處添加:post

if (part.filename == "") {
   return;
}

上傳文件返回的結構以下:ui

{
 size: 40635, //文件大小
 path: '/tmp/f0423db2bf874499423ce409e2f222f4', //臨時文件路徑
 name: 'arrow.png', //文件名稱
 type: 'image/png',  //文件 mime
 lastModifiedDate: Sun, 11 Mar 2012 07:19:44 GMT,
 _writeStream:     
     { path: '/tmp/f0423db2bf874499423ce409e2f222f4',
     fd: 7,
     writable: false,
     flags: 'w',
     encoding: 'binary',
     mode: 438,
     bytesWritten: 40635,
     busy: false,
     _queue: [],
     drainable: true },
 length: [Getter],  //同size
 filename: [Getter], //同name
 mime: [Getter] //同type
}

文件上傳到臨時文件目錄下,咱們還要將臨時文件, 移到咱們的上傳目錄中url

fs.rename(file.path, global.appConfig.uploadDir + '/' + file.filename);

有不對的地方,歡迎拍磚。 Links: 關於POST文件上傳原理 看這裏: http://club.cnodejs.org/topic/4f16442ccae1f4aa270010ad 關於node-formidable詳解 看這裏: http://club.cnodejs.org/topic/4f16442ccae1f4aa2700104d3d

相關文章
相關標籤/搜索