100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Node层模拟实现multipart表单文件上传详解

Node层模拟实现multipart表单文件上传详解

时间:2020-05-18 07:24:35

相关推荐

Node层模拟实现multipart表单文件上传详解

web前端|js教程

multipart,Node,表单

web前端-js教程

有时候就是有这样的需求,Nodejs做webserver,从浏览器端上传文件到后端服务器,Node层只是做一个数据中转,如果在这个过程中,Node webserver需要对数据进行适当加工,然后再Post到后端,那么就得在Node层模拟文件上传了。本文主要为大家分享一篇Node层模拟实现multipart表单的文件上传示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。

wstshop 手机源码,vscode大写变小写,ubuntu 卸载ros,tomcat tcp分片,sqlite编辑器修改通话,怎么判断爬虫行为是不是合法,flv php播放,合肥网络seo营销推广,绿色的系统下载网站模板下载,网页表格中简介的jquery数量加减,dede登录模板下载lzw

首先,通过浏览器上传文件,PostData格式是长着个样子的:

wav音量增大源码,vscode如何加背景图,ubuntu文件登录,打不开tomcat欢迎,网络爬虫联盟,php手册全集下载,浙江seo优化哪家公司好lzw

asp 登录系统源码,Ubuntu运行安装Qt,网络爬虫怎么翻译,php strfind,兰亭外贸seolzw

屏幕快照 -11-22 下午9.18.45.jpg

如图,每一组数据其实就是用“—–WebkitFormBoundary…..”分隔开的,最后再用这个分隔符结束,而且,这个分隔符完全是可自定义的。

每一段提交数据,则通过Content-Disposition来描述,未指定Content-Type,则默认text/plain,如果是上传的二进制文件,指定其mime-type即可。

简单封装一个方法,实现Node层的文件上传:

/** * 上传文件 * @param files 经过formidable处理过的文件 * @param req httpRequest对象 * @param postData 额外提交的数据 */function uploadFile(files, req, postData) { var boundaryKey = Math.random().toString(16); var endData = \ \n---- + boundaryKey + --; var filesLength = 0, content; // 初始数据,把post过来的数据都携带上去 content = (function (obj) { var rslt = []; Object.keys(obj).forEach(function (key) { arr = [\ \n---- + boundaryKey + \ \n]; arr.push(Content-Disposition: form-data; name=" + key + \"\r\n\r\n); arr.push(obj[key]); rslt.push(arr.join(\)); }); return rslt.join(\); })(postData); // 组装数据 Object.keys(files).forEach(function (key) { if (!files.hasOwnProperty(key)) { delete files.key; return; } content += \ \n---- + boundaryKey + \ \n + Content-Type: application/octet-stream\r\n + Content-Disposition: form-data; name=" + key + \"; + filename=" + files[key].name + \"; \r\n + Content-Transfer-Encoding: binary\r\n\r\n; files[key].contentBinary = new Buffer(content, utf-8); filesLength += files[key].contentBinary.length + fs.statSync(files[key].path).size; }); req.setHeader(Content-Type, multipart/form-data; boundary=-- + boundaryKey); req.setHeader(Content-Length, filesLength + Buffer.byteLength(endData)); // 执行上传 var allFiles = Object.keys(files); var fileNum = allFiles.length; var uploadedCount = 0; allFiles.forEach(function (key) { req.write(files[key].contentBinary); var fileStream = fs.createReadStream(files[key].path, {bufferSize: 4 * 1024}); fileStream.on(end, function () { // 上传成功一个文件之后,把临时文件删了 fs.unlink(files[key].path); uploadedCount++; if (uploadedCount == fileNum) { // 如果已经是最后一个文件,那就正常结束 req.end(endData); } }); fileStream.pipe(req, {end: false}); });}

思路就这样,代码也不复杂,可能额外需要注意的是,在http.request的response处理中,response.headers可能是gzip的,这个时候buffer不能直接toString,需要通过zlib解码再转换为string,大概思路:

var result = [];response.on(data, function (chunk) { result.push(chunk);});// 处理responsevar _dealResponse = function (data) { var buffer = data; try { data = data.toString(utf8); data = data ? (JSON.parse(data) || data) : false; } catch (err) { // 接口返回数据格式异常,解析失败 console.log(err); } self.res.writeHead(response.statusCode, OK, { content-type: ext/plain; charset=utf-8, content-length: buffer.length }); self.res.write(buffer); self.res.end();};response.on(end, function () { result = Buffer.concat(result); // gzip 的数据,需要zlib解码 if (response.headers[content-encoding] == gzip) { zlib.gunzip(result, function (err, dezipped) { var data = err ? new Buffer({}) : dezipped; _dealResponse(data); }); } else { _dealResponse(result); }});

Mark一下,也许你路过正好需要~~~

form表单上传图片表单标签中enctype=”multipart/form-data”的作用

php HTTP请求类,支持GET,POST,Multipart/form-data

为什么上传文件的表单需要设置enctype=”multipart/form-data”

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。