我正在尝试接收可能包含各种文件和字段的多部分数据流并将文件写入目录(uWebsockets.js 服务器)。我有这个代码:
let boundary = null;
let fields = [];
let streams = [];
let keep = false;
res.onData((chunk, isLast) => {
const buff = Buffer.concat([Buffer.from(chunk)]).toString('binary').split('\r\n');
if (!boundary) {
boundary = buff[0];
}
for (let i = 0; i < buff.length; i++) {
const line = buff[i];
if (i > 0 && i < buff.length - 1 && line == '') {
keep = true;
continue;
}
if (line == boundary || line == boundary + '--') {
keep = false;
if (streams[fields.length - 1]) {
streams[fields.length - 1].end();
}
}
if (line == boundary) {
fields[fields.length] = {};
}
if (line.includes('Content-Disposition')) {
if (line.includes('filename="')) {
fields[fields.length - 1].filename = getFilename(line);
fields[fields.length - 1].type = 'file';
fields[fields.length - 1].path = path.resolve(options.uploadPath + fields[fields.length - 1].filename);
streams[fields.length - 1] = fs.createWriteStream(
path.resolve(options.uploadPath + fields[fields.length - 1].filename)
);
} else {
fields[fields.length - 1].type = 'field';
}
fields[fields.length - 1].name = getField(line);
}
if (line.includes('Content-Type')) {
fields[fields.length - 1].contentType = line.split('Content-Type: ')[1];
}
if (keep == true) {
if (fields[fields.length - 1].filename) {
streams[streams.length - 1].write(Buffer.from(line + "\r\n", 'binary'));
} else {
fields[fields.length - 1].value += line;
}
}
}
if (isLast) {
console.log(fields);
}
});
它的工作原理是上传的图像已损坏并被随机剪切(每张图像都不相同,有些完全损坏,有些完全没问题)。有人可以指出它有什么问题吗?
提前致谢 :)