可以直接html5標籤multiple多input多文件、單input多文件上傳.
formidable根據文檔,form.multiples = true; 我並沒有得到預期的[ files ]所以,寫了以下的處理方式: 把所有http請求欄位、上傳文件合併到一個列表:
{ "name" : "lili", "phone" : "12345600000", "upload_one" : { "1.gif" : { ..., name:"1.gif", path:"/home/aa/tmp/2190eq0919.gif", ... }, "2.txt" : {...}, ... }, "upload_two" : { "11.gif" : { ..., name:"1.gif", path:"/home/aa/tmp/2190eq0919.gif", ... }, "21.txt" : {...}, ... },}
可以直接html5標籤multiple多input多文件、單input多文件上傳.
源碼如下:
var utility = require("utility"), find = require("./find"), http = require("http"), path = require("path"), fs = require("fs"), fd = require("formidable");function connect (routes, conf, cons) { return function (req, res) { var fif = new fd.IncomingForm(), ffiles = {}, route; // 路由處理器 fif.keepExtensions = true; // 保留擴展名 fif.uploadDir = conf.ldir.tmp; // 上傳臨時目錄 fif.on("file", function(name, file) { if (typeof ffiles[name] !== "object" || ffiles[name] === null) { ffiles[name] = {}; } ffiles[name][file.name] = file; }); fif.parse(req, function (err, fields, files) { res.req = req; // utility.merge為合併函數, 將多個對象合併,類似jQuery的extend // 不再列出 req.body = utility.merge(fields, ffiles); // 路由處理函數查找,可能每個人寫法都不一樣 route = find(routes, req.headers.host, req.url, req.method); if (typeof route.handler === "function") { route.handler(req, res, conf, cons); } else { // 404處理 } }); };}module.exports = connect;
重點是
var ffiles = {};fif.on("file", function(name, file) { if (typeof ffiles[name] !== "object" || ffiles[name] === null) { ffiles[name] = {}; } ffiles[name][file.name] = file;});
建立一個對象ffiles, 存儲解析的文件內容
ffiles組裝完後是這樣的:
{ "upload_one" : { "1.gif" : {..., "name":"1.gif", path:"...", type:"...", ...}, "2.txt" : {...} }}
然後將ffiles附到req.body,提升使用範圍.
req.body.upload_one["1.gif"].name 獲取文件名req.body.upload_one["1.gif"].type 獲取文件類型req.body.upload_one["1.gif"].path 獲取文件上傳磁碟路徑
...其他查看console.log(req.body)
推薦閱讀:
※Asp.net 文件上傳的 FileUpload FileName 和 FileUpload PostedFile.FileName的細節問題
※ASP.NET MVC文件上傳、文件拖拽上傳demo
※文件上傳的漏網之魚