【发布时间】:2020-08-18 09:17:40
【问题描述】:
我正在尝试接收可能包含各种文件和字段的多部分数据流并将文件写入目录(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);
}
});
它可以正常工作,只是上传的图像已损坏并被随机剪切(每张图像都不相同,有些完全损坏,有些则完全正常)。 有人能指出它有什么问题吗?
提前致谢:)
【问题讨论】:
-
你看过 Mutler:npmjs.com/package/multerForm-data:npmjs.com/package/form-data我创建了一个使用
multipartform-data提交的节点端点。 -
如果你愿意,我可以分享代码。至于您的代码,我建议您尝试手动执行。
-
@mmason33 是的,如果你能和我分享,那就太好了!谢谢
-
@mmason33 Mutler 是一个 Express 中间件,对吗?如果是这样,那么它将无法工作,因为我没有使用 Express。我正在使用 uWebsocket.js 作为 Express 的替代品。
标签: javascript node.js stream multipartform-data uwebsockets