无需上传即可检索文件数据(Express、Multer)

Retrieve File data without uploading (Express, Multer)

我想通过拖放将文件从浏览器上传到 Express 服务器,该服务器将点击实际 API 进行文件上传。因此,文件不需要上传保存在Express服务器的任何地方,只需要将数据临时传递给API调用即可。

所以我从浏览器上传到 Express:

onDrop = async newFiles => {
  let formData = new FormData()

  for (let i = 0; i < newFiles.length; i++) {
    let file = newFiles[i]

    formData.append('files', file)
  }

  try {
    const response = await axios.post('/upload', formData)
  } catch (error) {
    console.log(error)
  }

我使用 Multer 从 Express 中检索 formData。

const router = require('express').Router()
const multer = require('multer')
const path = require('path')

const upload = multer({
  dest: 'path/to/uploads',
}).array('files')

router.post('/upload', preAuth, upload, async (request, response) => {
  const { files } = request
  // API call
})

但我只是想暂时检索实际文件而不将其上传到任何地方,然后将其发送到端点。我想不出任何方法来做到这一点,或者它是否可能。

基本上文件是按要求提供的,即在 req.file 中,使用它通过 next("file") 将其传递给下一个中间件。也许你不需要 Multer,使用 Cloudinary 服务器和他的 API

我最终使用 express-fileuploadform-data 来完成将 multipart/formdata 从浏览器上传到 Express 到另一个端点的任务。

React Dropzone 前端

onDrop = async newFiles => {
  let formData = new FormData()

  for (let i = 0; i < newFiles.length; i++) {
    let file = newFiles[i]

    formData.append('files', file)
  }

  try {
    const response = await axios.post('/upload', formData)
  } catch (error) {
    console.log(error)
  }
}

快递后端

const fileUpload = require('express-fileupload')
app.use(fileUpload())
const router = require('express').Router()
const FormData = require('form-data')
const axios = require('axios')

router.post('/upload', preAuth, async (request, response) => {
  const { files } = request

  const formData = new FormData()

  for (let i = 0; i < files.length; i++) {
    let file = files[i]

    formData.append('files', file)
  }

  const formHeaders = formData.getHeaders()

  try {
    const { data } = await axios.post(
      `path/to/endpoint',
      formData,
      {
        headers: {
          'Content-Type': formHeaders['content-type'],
          ...formHeaders,
        },
      }
    )
    response.status(200).send(data)
  } catch (error) {
    response.status(400).send({ message: 'Error'})
  }
})