使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中
Posted
技术标签:
【中文标题】使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中【英文标题】:Using Multer to upload a file and briefly store it in memory before parsing and uploading to database 【发布时间】:2017-03-04 05:29:08 【问题描述】:我对编程比较陌生,但我会尽量做到简洁。
我正在使用 multer 尝试上传 XML 文件。我有一个 Node Express 服务器,并且也在使用带有 .jsx 的 React。上传后,我将解析该文件数据并将其发布到 Postgres 数据库。所以考虑到这一点,我不会将上传的文件写入磁盘,我只是在解析之前使用 multer 的 buffer 属性将其存储在内存中。
我让 multer 在一个小型测试项目中使用 jQuery 进行表单提交,但我在这里没有使用 jQuery,我不确定表单提交在 React 中是如何工作的,或者这是否是问题所在。我只包括与使用 multer 直接相关的代码。其他一切正常。
这是我的表格:
<form
id="uploadForm"
ref="form"
encType="multipart/form-data"
method="post"
action="/upload"
onSubmit=this.handleSubmit
>
<input
type="file"
name="songlist"
/>
<input
type="submit"
value="UploadFile"
name="submit"
/>
</form>
这是我在同一组件中的表单提交处理。 onSubmit 是自动提交表单还是我应该在这里做其他事情?
handleSubmit(event)
console.log('hey');
event.preventDefault();
this.props.postSongs();
,
postSongs() 调用我的服务器端路由:
postSongs()
axios.post("/upload")
.then(() =>
console.log('success')
)
.catch((err) =>
console.error(err);
);
,
在我的服务器端路由中,我正在发出 post 请求,该请求应该将该文件存储在 multer 的内存中:
const multer = require('multer');
const upload = multer(inMemory: true);
router.post('/upload', upload.single('songlist'), (req, res, next) =>
console.log(req.file);
knex('songs')
.where('admin_id', adminId)
.first()
.then((songs) =>
console.log(songs);
)
.catch((err) =>
next(err);
);
);
我知道这段代码中缺少关于实现最终目标的部分,但现在我只是想记录 multer 的文件对象 (req.file)。我认为upload.single('songlist')
应该访问表单中名为 songlist 的特定输入,而我的与表单操作匹配的帖子应该与所有这些匹配?
我认为我没有正确解释这一点。有什么帮助吗?我在这上面浪费了很多时间。
【问题讨论】:
【参考方案1】:您不是在发布表单,而是在发布一个空的正文。试试这个:
var formData = new FormData(document.getElementById('uploadForm'));
axios.post('upload', formData)
.then(() =>
console.log('success');
)
.catch((err) =>
console.error(err);
);
【讨论】:
啊啊啊啊!非常感谢!我是如此接近!以上是关于使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Multer 将文件上传到文件夹之前删除和创建文件夹