Cloudinary\Error:缺少必需的参数 - 文件 - Express 和 Postman

Posted

技术标签:

【中文标题】Cloudinary\\Error:缺少必需的参数 - 文件 - Express 和 Postman【英文标题】: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

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

【问题讨论】:

【参考方案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());

【讨论】:

以上是关于Cloudinary\Error:缺少必需的参数 - 文件 - Express 和 Postman的主要内容,如果未能解决你的问题,请参考以下文章

“fit() 缺少 1 个必需的位置参数:'y'”错误

请求缺少必需的参数,包含无效的参数值

Cloudinary 错误:“错误”:“消息”:“缺少必需的参数 - 时间戳”

缺少 1 个必需的位置参数:'queryset'

缺少必需的参数(laravel 8.8.0)

TypeError:缺少 1 个必需的位置参数:'self'