如何使用 formdata 将图像文件发送到 React/Next js api?

Kal*_*Kal 4 reactjs next.js vercel

我正在尝试将文件发送到下一个 js 应用程序中的 api。图像将上传到cloudinary:

调用api的函数为:

  async uploadButtonClicked(imageUpload) {
      const formData = new FormData();
      //formData.append('test', "testing");
      formData.append('postPic', imageUpload.files[0]);
      const res = await fetch('/api/hello', {
        method: 'POST',
        headers: {
          'Content-Type': 'multipart/form-data',
          'Accept': 'application/json'
        },
        body: formData,
      })
Run Code Online (Sandbox Code Playgroud)

console.log(imageUpload.files[0])前端给了我下面的值,看起来不错。 在此输入图像描述

在 API 中,

export default (upload.single('postPic'), async (req, res) => {
  console.log(req.body)
Run Code Online (Sandbox Code Playgroud)

上面是undefined我使用时的情况

export const config = {
  api: {
    bodyParser: false,
  },
};
Run Code Online (Sandbox Code Playgroud)

当我删除 bodyParser 设置(bodyParser 为 true)时,数据作为流,对上传没有用处。我收到上传错误,如下所示: 在此输入图像描述

如果正文到达以下格式的 api,Cloudinary 将上传: 在此输入图像描述

应该改变什么才能让主体(基本上是一个图像文件)以正确的格式到达 api,如上所示?

我认为这个问题也可以问为:为什么req.body undefined使用时bodyParser: false

小智 6

我遇到了同样的错误,但 Formidable 对我有用。尝试先将图像放入表单数据中。

来自客户:

export const uploadImage = async (image) => {

    const formData = new FormData();
    formData.append('image', image);
    const response = await axios.post('/api/v1/image', formData);
    return response.data;
}
Run Code Online (Sandbox Code Playgroud)

以下是服务器 API:/api/v1/image

import formidable from 'formidable';


export const config = {
  api: {
    bodyParser: false,
  },
}

export default async (req, res) => {
  const form = new formidable.IncomingForm();
  form.uploadDir = "./";
  form.keepExtensions = true;
  form.parse(req, (err, fields, files) => {
    console.log(err, fields, files);
  });
};
Run Code Online (Sandbox Code Playgroud)