t-comm
Version:
专业、稳定、纯粹的工具库
108 lines (105 loc) • 3.7 kB
JavaScript
import * as fs from 'fs';
import * as http from 'http';
import * as path from 'path';
function postFile(fileDataInfo, fileKeyValue, options) {
return new Promise(function (resolve, reject) {
if (!options) {
console.log('[publish] failed. 需要 options');
return;
}
var req = http.request(options, function (res) {
// res.setEncoding("utf8");
res.on('data', function (chunk) {
var result = {};
try {
result = JSON.parse(chunk);
} catch (_a) {}
console.log('[postFile] result: ', result);
resolve(result);
});
});
req.on('error', function (e) {
console.log("[postFile] problem with request: ".concat(e.message));
reject(e);
});
var boundaryKey = Math.random().toString(16);
var endData = "\r\n----".concat(boundaryKey, "--");
var dataLength = 0;
var dataArr = [];
for (var _i = 0, fileDataInfo_1 = fileDataInfo; _i < fileDataInfo_1.length; _i++) {
var item = fileDataInfo_1[_i];
var dataInfo = "\r\n----".concat(boundaryKey, "\r\n") + "Content-Disposition: form-data; name=\"".concat(item.urlKey, "\"\r\n\r\n").concat(item.urlValue);
var dataBinary = Buffer.from(dataInfo, 'utf-8');
dataLength += dataBinary.length;
dataArr.push({
dataInfo: dataInfo
});
}
var files = [];
for (var _a = 0, fileKeyValue_1 = fileKeyValue; _a < fileKeyValue_1.length; _a++) {
var item = fileKeyValue_1[_a];
var content = "\r\n----".concat(boundaryKey, "\r\n") + 'Content-Type: application/octet-stream\r\n' + "Content-Disposition: form-data; name=\"".concat(item.urlKey, "\"; filename=\"").concat(path.basename(item.urlValue), "\"\r\n") + 'Content-Transfer-Encoding: binary\r\n\r\n';
// 当编码为ascii时,中文会乱码。
var contentBinary = Buffer.from(content, 'utf-8');
files.push({
contentBinary: contentBinary,
filePath: item.urlValue
});
}
var contentLength = 0;
for (var _b = 0, files_1 = files; _b < files_1.length; _b++) {
var item = files_1[_b];
var filePath = item.filePath;
if (fs.existsSync(filePath)) {
var stat = fs.statSync(filePath);
contentLength += stat.size;
} else {
contentLength += Buffer.from('\r\n', 'utf-8').length;
}
contentLength += item.contentBinary.length;
}
req.setHeader('Content-Type', "multipart/form-data; boundary=--".concat(boundaryKey));
req.setHeader('Content-Length', dataLength + contentLength + Buffer.byteLength(endData));
// 将参数发出
for (var _c = 0, dataArr_1 = dataArr; _c < dataArr_1.length; _c++) {
var item = dataArr_1[_c];
req.write(item.dataInfo);
}
var fileIndex = 0;
var _doOneFile = function doOneFile() {
req.write(files[fileIndex].contentBinary);
var currentFilePath = files[fileIndex].filePath;
if (fs.existsSync(currentFilePath)) {
// @ts-ignore
var fileStream = fs.createReadStream(currentFilePath, {
bufferSize: 4 * 1024
});
fileStream.pipe(req, {
end: false
});
fileStream.on('end', function () {
fileIndex += 1;
if (fileIndex === files.length) {
req.end(endData);
} else {
_doOneFile();
}
});
} else {
req.write('\r\n');
fileIndex += 1;
if (fileIndex === files.length) {
req.end(endData);
} else {
_doOneFile();
}
}
};
if (fileIndex === files.length) {
req.end(endData);
} else {
_doOneFile();
}
});
}
export { postFile };