【问题标题】:Cloudinary\Error: Missing required parameter - file - Express and PostmanCloudinary\Error:缺少必需的参数 - 文件 - Express 和 Postman
【发布时间】:2021-06-02 02:26:55
【问题描述】:

第一次尝试将图像上传到 Cloudinary,我在通过 Postman 使用 Express 时遇到了问题。

Using form-data on setting 'file' to upload an image to Cloudinary

截至目前,当我尝试访问 req.body 时,我得到一个空对象,所以我想这与为什么 cloudinary.uploader.upload 无法读取作为其第一个参数传递的文件有关,因为它的 req. body.file,如下代码所示。

cloudinary.config({
    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
    api_key: process.env.CLOUDINARY_KEY,
    api_secret:  process.env.CLOUDINARY_SECRET
})



exports.upload = async (req, res) => {

  try{
   
console.log(req.body);
const result =  await cloudinary.uploader.upload(req.body.file, {
    public_id: `${Date.now()}`, 
    resource_type: "auto"
})

return res.json({
    public_id: result.public_id,
    url: result.secure_url
})

}catch(err){
  console.log(err)
}

} 

我得到的错误信息:

{
  message: 'Missing required parameter - file',
  name: 'Error',
  http_code: 400
}

有解决这个问题的建议吗?

【问题讨论】:

    标签: express file-upload error-handling postman cloudinary


    【解决方案1】:

    我解决了!我无法将表单数据作为 req.body 传递给服务器,所以我不得不尝试通过 req.files 访问它,但也无法使用它,所以我搜索了一下,发现了一个中间件' express-fileupload',这就是诀窍。我只是将它添加到我的 app.js 中并使用了

    const fileupload = require('express-fileupload'); 
    
    app.use(fileupload({useTempFiles: true}))
    

    所以现在我可以访问我的 req.files。

    exports.upload = async (req, res) => {
    
      const file = req.files.image
    
      try{
    console.log(file);
    
    const result =  await cloudinary.uploader.upload(file.tempFilePath, {
        public_id: `${Date.now()}`, 
        resource_type: "auto"
    })
    
    res.json({
        public_id: result.public_id,
        url: result.secure_url
    })
    
    }catch(err){
      console.log("Error", err)
    return res.status(400).json({error: err})
    }
    
    } 
    

    我得到的回应是:

    {
      name: 'some-image.png',
      data: <Buffer >,
      size: 99770,
      encoding: '7bit',
      tempFilePath: ' **C:\\filepath\some-image.png** ',
      truncated: false,
      mimetype: 'image/png',
      md5: 'b5f612a571442bf604952fd12c47c1bf',
      mv: [Function: mv]
    }
    POST /cloudinary/upload-images 200 1617.944 ms - 119
    

    它已成功上传到我的 Cloudinary。

    【讨论】:

      【解决方案2】:

      const 结果 = await cloudinary.uploader.upload(req.file, { public_id:${Date.now()}, 资源类型:“自动” })

      并从表单数据中添加文件,类型应为文件

      【讨论】:

      • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。另请查看help center 以获取有关如何格式化代码的信息。
      【解决方案3】:

      解决了!

      这就是我设置 FormData 的方式

      let myTestForm = new FormData();
      
      myTestForm.set("name", name);
      myTestForm.set("email", email);
      myTestForm.set("Avatar", Avatar);
      myTestForm.set("password", password);
      

      这就是我使用 FormData 的方式

      const config = {
        headers: {
          "Content-type": "multipart/form-data",
        },
      };
      
      const { data } = await axios.post(`/api/v1/register`, userData, { config });
      

      请不要这样传递{ userData},为此苦苦挣扎:/

      这就是我上传图片的方式

      const myCloud = await cloudinary.v2.uploader.upload(req.body.Avatar, {
      folder: "Avatars",
      width: 150,
      crop: "scale",
      public_id: `${Date.now()}`,
      resource_type: "auto",
      

      });

      PS:就我而言,我只需要上传 1 张图片。 app.js 文件中没有传递任何参数

      app.use(bodyParser.urlencoded({ extended: true }));
      app.use(fileUpload());
      

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 2016-06-29
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2018-05-05
        相关资源
        最近更新 更多