问题描述
我正在尝试接收可能包含各种文件和字段的多部分数据流,并将这些文件写入目录(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);
}
});
除了上载的图像已损坏并被随机剪切(每个图像中的图像都不相同,某些图像完全损坏,而某些图像完全正常)之外,它的工作原理是正确的。 有人可以指出这是怎么回事吗?
预先感谢:)
解决方法
概率问题是最大长度。在uwebsocket.js上更改此值。 最好的方法是上传文件的表单数据。
更改此项:
maxPayloadLength: 512
,
您尝试过formidable吗? 我用它来解析我的多部分数据流。