使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中
Using Multer to upload a file and briefly store it in memory before parsing and uploading to database
我对编程还比较陌生,但我会尽量做到简洁。
我正在使用 multer 尝试上传 XML 文件。我有一个 Node Express 服务器,我也在使用 React 和 .jsx。上传后,我将解析该文件数据并将其 post 发送到 Postgres 数据库。因此,考虑到这一点,我不会将上传的文件写入磁盘,我只是在解析之前使用 multer 的缓冲区 属性 将其存储在内存中。
我让 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 的特定输入,而我匹配表单操作的 post 应该匹配所有这些吗?
我认为我没有正确解释这一点。有什么帮助吗?我在这上面浪费了很多时间。
您发布的不是表单,而是空的正文。试试这个:
var formData = new FormData(document.getElementById('uploadForm'));
axios.post('upload', formData)
.then(() => {
console.log('success');
})
.catch((err) => {
console.error(err);
});
我对编程还比较陌生,但我会尽量做到简洁。
我正在使用 multer 尝试上传 XML 文件。我有一个 Node Express 服务器,我也在使用 React 和 .jsx。上传后,我将解析该文件数据并将其 post 发送到 Postgres 数据库。因此,考虑到这一点,我不会将上传的文件写入磁盘,我只是在解析之前使用 multer 的缓冲区 属性 将其存储在内存中。
我让 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 的特定输入,而我匹配表单操作的 post 应该匹配所有这些吗?
我认为我没有正确解释这一点。有什么帮助吗?我在这上面浪费了很多时间。
您发布的不是表单,而是空的正文。试试这个:
var formData = new FormData(document.getElementById('uploadForm'));
axios.post('upload', formData)
.then(() => {
console.log('success');
})
.catch((err) => {
console.error(err);
});