nodejs 實現(xiàn)模擬form表單上傳文件
更新時間:2014年07月14日 09:42:52 投稿:hebedich
使用nodejs來模擬form表單進行文件上傳,可以同時上傳多個文件。
以前項目里有這個方法,最近在客戶那里出問題了,同事說,這個方法從來就沒管用過,SO,用了一天時間把這個方法給搞出來了(覺得花費的時間長了點),分享之。
代碼及測試用例:
var http = require('http'); var path = require('path'); var fs = require('fs'); function postFile(fileKeyValue, req) { var boundaryKey = Math.random().toString(16); var enddata = '\r\n----' + boundaryKey + '--'; var files = new Array(); for (var i = 0; i < fileKeyValue.length; i++) { var content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + fileKeyValue[i].urlKey + "\"; filename=\"" + path.basename(fileKeyValue[i].urlValue) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n"; var contentBinary = new Buffer(content, 'utf-8');//當編碼為ascii時,中文會亂碼。 files.push({contentBinary: contentBinary, filePath: fileKeyValue[i].urlValue}); } var contentLength = 0; for (var i = 0; i < files.length; i++) { var stat = fs.statSync(files[i].filePath); contentLength += files[i].contentBinary.length; contentLength += stat.size; } req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey); req.setHeader('Content-Length', contentLength + Buffer.byteLength(enddata)); // 將參數(shù)發(fā)出 var fileindex = 0; var doOneFile = function(){ req.write(files[fileindex].contentBinary); var fileStream = fs.createReadStream(files[fileindex].filePath, {bufferSize : 4 * 1024}); fileStream.pipe(req, {end: false}); fileStream.on('end', function() { fileindex++; if(fileindex == files.length){ req.end(enddata); } else { doOneFile(); } }); }; if(fileindex == files.length){ req.end(enddata); } else { doOneFile(); } } //測試用例 //http://nodejs.org/api/http.html#http_http_request_options_callback var files = [ {urlKey: "file1", urlValue: "E:\\DFBF.jpg"}, {urlKey: "file2", urlValue: "E:\\1.jpg"}, {urlKey: "file3", urlValue: "E:\\Pro 空格 中文.mp3"} ] var options = { host: "localhost", port: "8908" , method: "POST", path: "/Home/Upload" } var req = http.request(options, function(res){ console.log("RES:" + res); console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); //res.setEncoding("utf8"); res.on("data", function(chunk){ console.log("BODY:" + chunk); }) }) req.on('error', function(e){ console.log('problem with request:' + e.message); console.log(e); }) postFile(files, req); console.log("done");
服務端測試,用mvc在home控制器寫了個upload方法,并遍歷上傳的文件將其保存在硬盤上了。
只是上傳大文件會有問題,估計是需要服務器進行配置,暫且不管。
服務端方法(寫在了Home控制器下)
[HttpPost] public string Upload() { //HttpPostedFileBase file = this.Request.Files["file"]; //file.SaveAs(file.FileName); foreach (string file in this.Request.Files) { this.Request.Files[file].SaveAs(@"E:\新建文件夾\" + this.Request.Files[file].FileName); } return @"保存成功 路徑:E:\新建文件夾\"; }
運行腳本:
node nodejsPostFile.js
運行結(jié)果:
相關文章
Sublime Text3 配置 NodeJs 環(huán)境的方法
大家都知道,Sublime Text 安裝插件一般從 Package Control 中直接安裝即可,當我安裝 node js 插件時候,直接通過Package Control 安裝,雖然插件安裝成功了,但是找不到配置文件 Nodejs.sublime-build 來更改一些配置2020-05-05Mac OS X 系統(tǒng)下安裝和部署Egret引擎開發(fā)環(huán)境
之前的文章,我們已經(jīng)介紹了Windows 系統(tǒng)下安裝和部署Egret的開發(fā)環(huán)境,那么,這篇文檔中,我們主要介紹在Mac環(huán)境中安裝Egret以及部署2014-09-09