如何上传excel文件并在服务器中解析它而不在hapi.js中本地保存文件

时间:2017-08-23 03:52:24

标签: javascript xlsx hapijs exceljs

我正在尝试解析服务器中的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();

1 个答案:

答案 0 :(得分: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