t-comm
Version:
专业、稳定、纯粹的工具库
134 lines (127 loc) • 4.54 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var fs = require('fs');
var http = require('http');
var path = require('path');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
var http__namespace = /*#__PURE__*/_interopNamespace(http);
var path__namespace = /*#__PURE__*/_interopNamespace(path);
function postFile(fileDataInfo, fileKeyValue, options) {
return new Promise(function (resolve, reject) {
if (!options) {
console.log('[publish] failed. 需要 options');
return;
}
var req = http__namespace.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__namespace.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__namespace.existsSync(filePath)) {
var stat = fs__namespace.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__namespace.existsSync(currentFilePath)) {
// @ts-ignore
var fileStream = fs__namespace.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();
}
});
}
exports.postFile = postFile;