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

React Native通过fetch上传图片Android失败iOS正常,求解决方案

React Native Camera 图片上传 Android 报「Network request failed」解决方案

看起来你遇到的是 React Native 跨平台文件上传里典型的 Android 兼容性问题——iOS 对 FormData 和 URI 处理更宽松所以正常运行,而 Android 有更严格的规则。结合你的代码和问题描述,给你几个针对性的修复步骤:

1. 先修复代码里的明显变量错误

你的 uploadFile 函数里存在未定义的变量(method、data、url),这会导致请求体无法正确赋值,Android 对这类错误的容错性比 iOS 差很多:

// 修正后的 uploadFile 函数
function uploadFile(image, uploadUrl) { 
  const config = { 
    method: 'POST', 
    headers: { 
      Accept: 'application/json',
      // 注意:不要手动设置 Content-Type: multipart/form-data
    }, 
    credentials: 'include' 
  } 
  // 直接将 FormData 赋值给请求体
  config.body = image;
  return fetch(uploadUrl, config)
    .then(checkJSON) 
    .then(res => res.text()) 
    .then(parseJSON) 
    .catch(rejectRequest) 
}

调用时记得传入正确的上传地址:uploadFile(photoData, "你的Java API接口地址")

2. 调整 Android 的 URI 处理逻辑

Android 上 React Native Camera 返回的 URI 可能是 content:// 格式,FormData 无法直接处理这种 URI,需要转成真实的文件路径,并且保留 file:// 前缀:

import RNFS from 'react-native-fs'; // 先执行 npm install react-native-fs 安装依赖

async function onPhotoSelected(image) { 
  let fileUri = image.uri;
  
  // Android 下将 content:// 格式转换为真实文件路径
  if (Platform.OS === 'android' && fileUri.startsWith('content://')) {
    const stat = await RNFS.stat(fileUri);
    fileUri = stat.path;
  }
  
  // Android 必须添加 file:// 前缀才能被 FormData 识别
  if (Platform.OS === 'android' && !fileUri.startsWith('file://')) {
    fileUri = `file://${fileUri}`;
  }

  const photoData = new FormData(); 
  photoData.append('file', { 
    uri: fileUri, 
    type: image.type, 
    name: image.name 
  }); 
  uploadFile(photoData, "你的Java API接口地址"); 
}

3. 移除手动设置的 Content-Type

当使用 FormData 时,fetch 会自动生成包含 boundary 参数的 Content-Type(比如 multipart/form-data; boundary=----WebKitFormBoundaryxxxx),手动设置固定的 Content-Type 会导致服务器无法正确解析多部分表单数据,这是 Android 上传失败的高频原因。

4. 检查 Android 权限和存储配置

确保你的 AndroidManifest.xml 里配置了必要的权限,并且适配 Android 10+ 的分区存储规则:

<!-- 添加必要权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 在 application 标签中添加,适配 Android 10+ 分区存储 -->
<application 
  android:requestLegacyExternalStorage="true"
  ...其他原有配置
>

5. 验证服务器端的 Multipart 处理

如果以上步骤都无效,检查你的 Java API 是否正确处理 Multipart 请求:

  • 确认接口配置了 Multipart 解析器(比如 Spring Boot 中是否启用了自动配置的 MultipartResolver,或者添加了 @MultipartConfig 注解)
  • 检查服务器是否限制了上传文件的大小
  • 可以用 Postman 模拟相同的 Multipart 请求,验证服务器是否能正常接收并返回结果

按照这些步骤逐一排查,应该能解决 Android 上的上传失败问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:33:13