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

Expo Android端图片上传功能异常,请求排查代码问题

问题排查与修复方案

针对你代码里的网络错误,以下是几个关键问题和修复方法:

  • URL格式错误
    你的请求URL少了一个斜杠:https:/ff2f-160-202-36-170.ngrok-free.app,正确格式应该是https://ff2f-160-202-36-170.ngrok-free.app,缺失的斜杠会导致请求地址无效,直接触发网络错误。

  • 空Token导致授权失败
    const token = "",如果后端接口要求有效的Bearer Token验证,空Token会被拒绝访问,返回401 Unauthorized错误,这也会被捕获为网络/请求异常。请填入有效的授权Token。

  • FormData文件格式错误
    在React Native/Expo中,直接将ImagePicker返回的selectedImage传入FormData是无效的,需要构造符合要求的文件对象:

    // 假设selectedImage是ImagePicker返回的结果
    formData.append('file', {
      uri: selectedImage.uri,
      name: selectedImage.uri.split('/').pop(), // 从uri提取文件名
      type: selectedImage.type || 'image/jpeg' // 根据实际图片类型设置
    });
    

    后端需要正确识别文件的uri、名称和类型才能处理上传。

  • 手动设置Content-Type导致解析失败
    axios在处理FormData时会自动生成包含boundary的multipart/form-data请求头,手动设置'Content-Type': 'multipart/form-data'会丢失boundary参数,导致后端无法解析multipart数据。请移除headers中的这个配置:

    const headers = {
      'Authorization': `Bearer ${token}`,
      accept: 'application/json'
      // 移除 'Content-Type': 'multipart/form-data'
    }
    
  • 调试日志优化
    console.log(formData)无法在React Native中打印FormData的具体内容,建议改为打印单个字段:

    console.log('WorkforceId:', workforceId);
    console.log('File URI:', selectedImage.uri);
    console.log('FileType:', fileType);
    

修复后的完整代码示例:

async function uploadImages() {
  const token = "YOUR_VALID_TOKEN"; // 填入有效Token
  const workforceId = "ea3be847-c237-4191-aebc-9490d0f78fab";
  const fileType = 1;

  const headers = {
    'Authorization': `Bearer ${token}`,
    accept: 'application/json'
  };

  try {
    const formData = new FormData();
    formData.append('WorkforceId', workforceId);
    // 构造正确的文件对象
    formData.append('file', {
      uri: selectedImage.uri,
      name: selectedImage.uri.split('/').pop(),
      type: selectedImage.type || 'image/jpeg'
    });
    formData.append('fileType', fileType);

    // 优化调试日志
    console.log('Upload params:', {
      WorkforceId: workforceId,
      FileName: selectedImage.uri.split('/').pop(),
      FileType: fileType
    });

    const response = await axios.post('https://ff2f-160-202-36-170.ngrok-free.app/workforce/fileupload', formData, {
      headers: headers
    });

    console.log(response.data); // true or false
  } catch (error) {
    // 打印更详细的错误信息
    console.log('Upload error:', error.response?.data || error.message);
    throw error;
  }
}

另外,确保你的Expo应用有网络权限(安卓默认允许,但模拟器需确认能访问ngrok地址),同时检查ngrok服务是否正常运行、地址是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:10:04