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

Strapi技术问题:上传图片关联Restaurant模型失败排查

解决React Native上传图片到Strapi Restaurant模型的问题

看起来你遇到的核心问题是直接把React Native ImagePicker返回的uri字符串添加到FormData里,导致Strapi无法识别为文件——因为FormData里的files字段需要的是Blob/File对象,而不是字符串形式的uri。

下面是具体的修复步骤和代码示例:

1. 把ImagePicker的uri转换为Blob/File对象

React Native的ImagePicker返回的uri只是文件的路径字符串,不能直接当作文件传给Strapi。我们需要先通过fetch获取这个路径对应的Blob,再包装成File对象:

// 工具函数:将uri转换为File对象
const uriToFile = async (uri, fileName) => {
  const response = await fetch(uri);
  const blob = await response.blob();
  // 创建File对象,第三个参数传入文件名(优先用ImagePicker返回的fileName)
  return new File([blob], fileName, { type: blob.type });
};

2. 重构FormData上传代码

调用工具函数把uri转成File,再添加到FormData里,同时检查其他参数的正确性:

// 上传图片到Strapi的函数
const uploadRestaurantLogo = async (image, restaurantId) => {
  try {
    // 先把uri转换为File对象
    const file = await uriToFile(image.uri, image.fileName);
    
    const data = new FormData();
    // 这里传入File对象,而非uri字符串
    data.append('files', file);
    data.append('refId', restaurantId);
    // 注意:Strapi的ref参数需要匹配模型的UID,通常是小写单数(比如你的模型是Restaurant,这里应该是'restaurant',不是'Restaurants')
    data.append('ref', 'restaurant'); 
    data.append('field', 'Logo'); // 确保你的Restaurant模型里确实有叫Logo的媒体字段

    const response = await fetch('http://你的Strapi地址/api/upload', {
      method: 'POST',
      headers: {
        // 不要手动设置Content-Type!浏览器会自动生成带边界符的multipart/form-data头
        // 'Content-Type': 'multipart/form-data',
        Authorization: 'Bearer 你的JWT令牌', // 如果接口需要认证的话
      },
      body: data,
    });

    const result = await response.json();
    console.log('上传成功:', result);
    return result;
  } catch (error) {
    console.error('上传失败:', error);
  }
};

3. 关键注意点

  • 不要手动设置Content-Type:如果手动添加multipart/form-data,会丢失自动生成的边界符,导致Strapi无法解析FormData结构。
  • 确认ref参数的正确性:Strapi的ref需要匹配你的模型UID(在Strapi后台模型设置里可以查看,比如创建的Restaurant模型,UID通常是restaurant),不是复数形式。
  • 检查模型字段:确保你的Restaurant模型里确实有一个名为Logo的媒体字段(类型为Single Media或Multiple Media)。

4. 调试小技巧

如果还是有问题,可以在React Native里遍历FormData确认字段类型:

for (let [key, value] of data.entries()) {
  console.log(`${key}:`, value);
}

正常情况下files字段应该显示为File对象,而不是字符串。也可以查看Strapi的日志(执行strapi logs命令),获取更详细的错误信息。

内容的提问来源于stack exchange,提问作者Mohamed Moanis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:07:11