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

React Native用fetch+FormData上传Image Picker图片后端收[Object Object]如何解决

问题成因

标准的 FormData.append() 方法仅支持传入字符串、Blob、File类型作为第二个参数,你直接传入自定义的{filename, uri, type}对象时,运行环境会自动调用对象的toString()方法,最终序列化的结果就是[Object Object]字符串,这就是后端只能拿到字符串、识别不到文件的核心原因。
另外你代码中存在适配错误:React Native 环境下 FormData 识别的本地文件对象属性名为name,而非你写的filename。

解决方法

1 React Native 端(安卓/iOS 环境)

RN 框架内置的 fetch 对本地文件上传做了专属适配,修正两处配置即可:

  • 把自定义对象的filename属性改为name
  • 不要手动添加Content-Type: multipart/form-data请求头,fetch 会自动生成带边界标识(boundary)的正确请求头
    修正后代码:
const data = new FormData();
// 安卓端uri为file://开头格式直接传入即可,不需要额外处理
data.append('pic', { 
  name: 'dd.jpeg', // 此处把filename改为name
  uri: file.uri, 
  type: 'image/jpeg'
});
let res = await fetch(
  'http://192.168.0.88:8000/api/review/new',
  {
    method: 'POST',
    body: data,
    // 不要手动配置headers中的Content-Type字段
  }
);
let responseJson = await res.json();

2 Web 端环境

Web端 Image Picker 返回的是 base64 格式,需要先把 base64 转成 Blob 对象再传入 FormData:

const data = new FormData();
// base64转Blob工具函数
const base64ToBlob = (base64, type = 'image/jpeg') => {
  const byteCharacters = atob(base64.split(',')[1]);
  const byteArrays = [];
  for (let offset = 0; offset < byteCharacters.length; offset += 512) {
    const slice = byteCharacters.slice(offset, offset + 512);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }
  return new Blob(byteArrays, {type});
}
const picBlob = base64ToBlob(file.uri);
data.append('pic', picBlob, 'dd.jpeg');
let res = await fetch(
  'http://192.168.0.88:8000/api/review/new',
  {
    method: 'POST',
    body: data,
  }
);
let responseJson = await res.json();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:54:04