使用 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);
  });