设为首页 收藏本站
查看: 594|回复: 0

[经验分享] nodejs 模拟form表单上传文件

[复制链接]

尚未签到

发表于 2017-2-22 12:26:58 | 显示全部楼层 |阅读模式
var http = require('http');  var path = require('path');
  var fs = require('fs');
  function postFile(fileDataInfo, fileKeyValue, req) {
  var boundaryKey = Math.random().toString(16);
  var enddata = '\r\n----' + boundaryKey + '--';
  var dataLength = 0;
  var dataArr = new Array();
  for (var i = 0; i < fileDataInfo.length; i++) {
  var dataInfo = &quot;\r\n----&quot; + boundaryKey + &quot;\r\n&quot; + &quot;Content-Disposition: form-data; name=\&quot;&quot; + fileDataInfo.urlKey + &quot;\&quot;\r\n\r\n&quot; + fileDataInfo.urlValue;
  var dataBinary = new Buffer(dataInfo, &quot;utf-8&quot;);
  dataLength += dataBinary.length;
  dataArr.push({
  dataInfo: dataInfo
  });
  }
  var files = new Array();
  for (var i = 0; i < fileKeyValue.length; i++) {
  var content = &quot;\r\n----&quot; + boundaryKey + &quot;\r\n&quot; + &quot;Content-Type: application/octet-stream\r\n&quot; + &quot;Content-Disposition: form-data; name=\&quot;&quot; + fileKeyValue.urlKey + &quot;\&quot;; filename=\&quot;&quot; + path.basename(fileKeyValue.urlValue) + &quot;\&quot;\r\n&quot; + &quot;Content-Transfer-Encoding: binary\r\n\r\n&quot;;
  var contentBinary = new Buffer(content, 'utf-8'); //当编码为ascii时,中文会乱码。
  files.push({
  contentBinary: contentBinary,
  filePath: fileKeyValue.urlValue
  });
  }
  var contentLength = 0;
  for (var i = 0; i < files.length; i++) {
  var filePath = files.filePath;
  if (fs.existsSync(filePath)) {
  var stat = fs.statSync(filePath);
  contentLength += stat.size;
  } else {
  contentLength += new Buffer(&quot;\r\n&quot;, 'utf-8').length;
  }
  contentLength += files.contentBinary.length;
  }
  req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey);
  req.setHeader('Content-Length', dataLength + contentLength + Buffer.byteLength(enddata));
  // 将参数发出
  for (var i = 0; i < dataArr.length; i++) {
  req.write(dataArr.dataInfo)
  //req.write('\r\n')
  }
  var fileindex = 0;
  var doOneFile = function() {
  req.write(files[fileindex].contentBinary);
  var currentFilePath = files[fileindex].filePath;
  if (fs.existsSync(currentFilePath)) {
  var fileStream = fs.createReadStream(currentFilePath, {bufferSize: 4 * 1024});
  fileStream.pipe(req, {end: false});
  fileStream.on('end', function() {
  fileindex++;
  if (fileindex == files.length) {
  req.end(enddata);
  } else {
  doOneFile();
  }
  });
  } else {
  req.write(&quot;\r\n&quot;);
  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 fileDataInfo = [
  {urlKey: &quot;abc&quot;, urlValue: &quot;空格  中文&quot;},
  {urlKey: &quot;def&quot;, urlValue: &quot;asdfasfs123477&quot;}
  ]
  var files = [
  {urlKey: &quot;file1&quot;, urlValue: &quot;E:\\1.jpg&quot;},
  {urlKey: &quot;file2&quot;, urlValue: &quot;文件不存在&quot;},
  {urlKey: &quot;file3&quot;, urlValue: &quot;&quot;},
  {urlKey: &quot;file4&quot;, urlValue: &quot;&quot;},
  {urlKey: &quot;file5&quot;, urlValue: &quot;E:\\Pro 中文  空格.mp3&quot;},
  {urlKey: &quot;file6&quot;, urlValue: &quot;E:\\DFBF.jpg&quot;},
  {urlKey: &quot;file7&quot;, urlValue: &quot;&quot;}
  ]
  var options = {
  host: &quot;localhost&quot;,
  port: &quot;8908&quot;,
  method: &quot;POST&quot;,
  path: &quot;/Home/Upload&quot;
  }
  var req = http.request(options, function(res) {
  console.log(&quot;RES:&quot; + res);
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  //res.setEncoding(&quot;utf8&quot;);
  res.on(&quot;data&quot;, function(chunk) {
  console.log(&quot;BODY:&quot; + chunk);
  })
  })
  req.on('error', function(e) {
  console.log('problem with request:' + e.message);
  console.log(e);
  });
  postFile(fileDataInfo, files, req);
  console.log(&quot;done&quot;);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345765-1-1.html 上篇帖子: NodeJS+Express+MongoDB 下篇帖子: note.js之 Nodejs+Express4在windows下的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表