只是如今主要用nodejs作後端了,因此記錄一些上傳文件的使用方法。javascript
上傳文件的主要方式:html
一、form上傳,優勢是方便,缺點是無法回調,上傳後返回的數據無法處理java
二、ajax上傳,優勢是可控制,有回調,缺點是不太方便node
用form上傳,express後端接收,有不少插件,如formidable。可是沒有回調。ajax
用ajaxFileUpload上傳,express後端接收。看着像是ajax上傳,其實中間會生成form multipart/form-data,因此能夠使用multer接收,還有回調,確實挺不錯的。express
一、form上傳json
示例已經歸檔後端
二、ajax上傳:使用ajaxfileupload上傳,nodejs後端接受。post
htmlurl
<form> <input type='file' value='文件導入' id='csv_import' name='csv_import'/> <input type='button' value='上傳' id='csv_upload' name='csv_upload'/> </form> // form不須要添加其餘屬性 // input name和id保持一致
js
$.ajaxFileUpload({ url: '/csvUpload', type: 'post', secureuri: false, fileElementId: 'csv_import', data: { "userId": 123 }, dataType: 'json', success: function(data, status){ debugger }, error: function(data, status, e){ debugger } }); // 修改fileElementId
nodejs
var form = new multiparty.Form(); form.parse(req, function(err, fields, files){ if(err){ console.log('parse error:'+err); }else{ var input_file = files.csv_import[0]; var uploaded_path = input_file.path; var buf = new Buffer(1024*input_file.size); // 獲取文件的內容,做爲一個base,這裏只是讀取文件的內容,並無存儲 fs.open(uploaded_path, 'r+', function(err, fd) { if (err) { return console.error(err); } fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } var a = buf.slice(0, bytes).toString().split('\r\n'); var b = a.map(function(a_item){ return a_item.split(','); }) console.log(util.inspect({b: b})); }); }); } }) // 須要安裝multiparty // files.csv_import中的csv_import與id保持一致
// csv_import是id
注意:後端返回數據的方式
res.send(JSON.stringify({ code: 0, msg: '導入成功' }));
使用ajaxfileupload和multiparty上傳文件時,碰到了一個問題:上傳後直徑跳轉到/a?file_upload=...,並無按照res.redirect('/')來執行,好奇怪;success error也沒有捕獲到返回的數據。