chenkehao 发表于 2017-2-22 12:26:58

nodejs 模拟form表单上传文件

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.contentBinary);
  var currentFilePath = files.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]
查看完整版本: nodejs 模拟form表单上传文件