入門,高手見笑 表單數據一種是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