You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Ant Design的Upload组件使用Cloudinary实现图片上传?

报错根因与修复方案

1. 直接报错原因

Ant Design Upload 组件的 customRequest 属性要求接收函数类型的值,组件内部会直接调用该函数执行自定义上传逻辑。你当前给 customRequest 传的是 { serverUpload } 这样的对象结构,组件调用时识别不到可执行的函数,就会抛出 request is not a function 错误。

2. 修复步骤

第一步:修正 customRequest 赋值

修改 uploadProps 里的 customRequest 配置,直接传入函数本身,去掉外层对象包裹:

const uploadProps = {
  name: "file",
  customRequest: serverUpload, // 直接传函数,不要外层{}
  onChange(info) {
    // 原有逻辑保持不变
  },
  // 其余配置保持不变
};

第二步:修正 serverUpload 内部逻辑

你当前的上传逻辑存在两个无效问题:

  • 提前 await Promise.all([]) 空数组,后续往 result 中 push 请求不会被等待执行
  • customRequest 会针对每个选中的文件单独触发一次,不需要遍历整个已选文件列表,直接处理当前传入的单文件即可

修正后的 serverUpload 代码:

const serverUpload = async (options) => {
  const { onSuccess, file, onError } = options;
  try {
    const formData = new FormData();
    formData.append("file", file);
    formData.append("upload_preset", cloudinaryInfo.CLOUDINARY_UPLOAD_PRESET);
    // 上传当前单个文件
    const uploadResult = await axios.post(cloudinaryInfo.CLOUDINARY_IMAGE_UPLOAD_URL, formData);
    // 把Cloudinary返回的资源信息传给onSuccess,后续可以直接从文件列表的response字段取
    onSuccess(uploadResult.data, file);
  } catch (err) {
    console.log(err);
    onError(err);
  }
};

3. 后续使用说明

所有文件上传完成后,你可以直接从 imageFilesList 中每个文件对象的 response 字段,拿到 Cloudinary 返回的资源地址等信息,不需要额外存储上传结果。

内容的提问来源于stack exchange,提问作者Ronny Fitzgerald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:36:04