wzp
2021-05-13 7d694a9113118daec5be7ac224dab46a3b20f106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
var fs=require("fs")
var http = require('http');
var path = require('path');
 
function paserFileName(filename){
    if(filename.length>50){
        var dotIndex=filename.lastIndexOf(".");
        var exName=filename.substr(dotIndex);
        var fnlen=50-exName.length;
        return filename.substr(0,fnlen)+exName;
    }
    else
        return filename;
}
/**
 * 
 * @param {*} fileDataInfo  [{urlKey: "abc", urlValue: "空格  中文"}]
 * @param {*} fileKeyValue  [{urlKey: "file1", urlValue: "E:\\1.jpg"}]
 * @param {*} req 
 */
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 = "\r\n----" + boundaryKey + "\r\n" + "Content-Disposition: form-data; name=\"" + fileDataInfo[i].urlKey + "\"\r\n\r\n" + fileDataInfo[i].urlValue;
      var dataBinary = new Buffer(dataInfo, "utf-8");
      dataLength += dataBinary.length;
      dataArr.push({
          dataInfo: dataInfo
      });
  }
 
  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=\"" +paserFileName(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 filePath = files[i].filePath;
      if (fs.existsSync(filePath)) {
          var stat = fs.statSync(filePath);
          contentLength += stat.size;
      } else {
          contentLength += new Buffer("\r\n", 'utf-8').length;
      }
      contentLength += files[i].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[i].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("\r\n");
          fileindex++;
          if (fileindex == files.length) {
              req.end(enddata);
          } else {
              doOneFile();
          }
      }
  };
  if (fileindex == files.length) {
      req.end(enddata);
  } else {
      doOneFile();
  }
}
function postFiles(options,fileDataInfo,fileKeyValue,callBackFunc,errorCallBackFunc){
  var req = http.request(options, function(res) {
 
      res.on("data", function(chunk) {
            // console.log("BODY:" + chunk);
            if(callBackFunc){
              callBackFunc(JSON.parse(chunk));
            }
 
        })
  });
  req.on('error', function(e) {
    if(errorCallBackFunc){
        errorCallBackFunc(e)
    }
  });
  postFile(fileDataInfo,fileKeyValue,req);
}
exports.postFiles=postFiles;
 
 
// //测试用例
// //http://nodejs.org/api/http.html#http_http_request_options_callback
// var fileDataInfo = [
// {urlKey: "abc", urlValue: "空格  中文"},
// {urlKey: "def", urlValue: "asdfasfs123477"}
// ]
 
// var files = [
// {urlKey: "file1", urlValue: "E:\\1.jpg"},
// {urlKey: "file2", urlValue: "文件不存在"},
// {urlKey: "file3", urlValue: ""},
// {urlKey: "file4", urlValue: ""},
// {urlKey: "file5", urlValue: "E:\\Pro 中文  空格.mp3"},
// {urlKey: "file6", urlValue: "E:\\DFBF.jpg"},
// {urlKey: "file7", urlValue: ""}
// ]
 
// 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(fileDataInfo, files, req);
// console.log("done");