极乐门资源网 Design By www.ioogu.com
以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,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)); // 将参数发出 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
运行结果:
标签:
nodejs,上传
极乐门资源网 Design By www.ioogu.com
极乐门资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
极乐门资源网 Design By www.ioogu.com
暂无nodejs 实现模拟form表单上传文件的评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2025年01月19日
2025年01月19日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]