正确读取多部分数据流NodeJS

问题描述

我正在尝试接收可能包含各种文件和字段的多部分数据流,并将这些文件写入目录(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

更多详细信息:https://unetworking.github.io/uWebSockets.js/generated/interfaces/websocketbehavior.html#maxpayloadlength

,

您尝试过formidable吗? 我用它来解析我的多部分数据流。