express文件上传,直接从内存中读取

express

问题

用express做一个小练习,想加入文件上传的功能,搜索了解决方案,都是用了multer库,在声明multer时,指定好了文件路径,通过路由上传的文件流直接就存储到指定文件路径了。

但我想做的是文件(excel文件)上传后不要保存文件,直接从内存中读取并使用node-xlsx库解析后处理写入数据库。度娘上搜索很久没找到,暂时用保存文件后再fs读取解析的方式实现了,但始终不爽,因为我还要写入库完成后删除文件的方法,很麻烦。

解决

直接看官方文档吧,看下有没有解决方案,在github找到multer,发现竟然还有中文版的,真棒。multer文档链接在此

我在其文档中找到这么句话,“Multer 具有 DiskStorage 和 MemoryStorage 两个存储引擎;另外还可以从第三方获得更多可用的引擎”。这不就解决问题了,MemoryStorage明显就是内存存储么。继续下翻,找到了内存存储引擎的使用讲解,下面是原文

内存存储引擎将文件存储在内存中的 Buffer 对象,它没有任何选项。

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
当使用内存存储引擎,文件信息将包含一个 buffer 字段,里面包含了整个文件数据。

警告: 当你使用内存存储,上传非常大的文件,或者非常多的小文件,会导致你的应用程序内存溢出。

根据文档修改我的代码,如下:

var Xlsx = require('node-xlsx');
var multer = require('multer');
var storage = multer.memoryStorage()
var upload = multer({ storage: storage });

router.post('/import', upload.single('xlsx'), async (req, res) => {

    const file = req.file;
    let worksheet = await Xlsx.parse(file.buffer)[0].data;
    // 下面遍历worksheet读出excel文件的内容进行处理,然后写数据库就可以了
}

看文档中,存储引擎可以自己构建,没有具体实践,大概应该是可以自己构建基于oss或者分布式文件系统的存储引擎。

点击数:104

1人评论了“express文件上传,直接从内存中读取”

  1. 在线求一个解决方案,如何做到中转文件

    A公司:接口A:图片上传,不提供存储,只做转发
    B公司:接口B:图片上传,提供存储

    小明通过 A公司提供接口上传图片,A公司的服务是收到图片并转发给B公司存储

    在线求Demo。。。。

JoyNop进行回复 取消回复

您的电子邮箱地址不会被公开。

*

code