0

我正在尝试解析服务器中的 excel 文件数据,它工作正常,但问题是它正在将我们上传到本地磁盘的文件保存在上传文件夹中,然后它正在读取数据。这是工作正常的代码但是在上传大型 xlsx 文件时会出现问题,因为它需要额外的内存并在本地磁盘中创建与另一个文件相同的文件。

server.route({
    method: 'post',
    path: `${(options.apiBase || '/xlsx/')}get`,
    config: {
        payload: {
            output: 'stream',
            parse: true,
            allow: 'multipart/form-data'
        }
    },
    handler: function (req, reply) {
        try {
            const data = req.payload;
            if (data.file) {
                let name = data.file.hapi.filename;
                console.log("FIlename: " + name);

                let path = __dirname + "/uploads/" + name;
                let file = fs.createWriteStream(path);

                data.file.pipe(file);
                data.file.on('end', function (err) {

                    if (typeof require !== 'undefined')
                        XLSX = require('xlsx');

                    const workbook = XLSX.readFile(path);
                    console.log("row======>>>>");
                    const sheet_name_list = workbook.SheetNames;
                    const content =
                        XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
                    console.log(content);

                    var ret = {
                        filename: data.file.hapi.filename,
                        headers: data.file.hapi.headers
                    }
                    reply(JSON.stringify(content));
                })
            } catch (err) {
                console.log('Err----------------------' + err);
                // error handling
                reply(Boom.badRequest(err.message, err));
            }
        }
});

next();
4

1 回答 1

0

您需要设置config.payload.parse为 false。这将返回原始流。但请注意,如果您要上传multipart/form-data,则需要自己解析。

config: {
    payload: {
        output: 'stream',
        parse: false,
        allow: 'multipart/form-data'
    }
}

这是由subtext模块处理的。见https://github.com/hapijs/subtext/blob/0bf83af78e364518577913db1bbc9c27bc739d7a/lib/index.js#L67

于 2017-09-19T07:39:53.090 回答