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

Expo Image Picker结合XMLHttpRequest在React Native中异常求助

Expo ImagePicker + Firebase 上传问题解决

Web端上传HTML片段问题

你当前的错误核心是:Web端Expo ImagePicker返回的是base64字符串,但你用XMLHttpRequest的GET请求去“获取”这个字符串,相当于把base64当成了HTTP URL,浏览器解析无效地址后返回了JS未启用的提示HTML。

正确做法是直接将base64转换为Blob,不需要发起XHR请求:

// base64转Blob工具函数
const base64ToBlob = (base64Str, contentType = '') => {
  const raw = atob(base64Str.split(',')[1]);
  const uInt8Array = new Uint8Array(raw.length);
  for (let i = 0; i < raw.length; i++) {
    uInt8Array[i] = raw.charCodeAt(i);
  }
  return new Blob([uInt8Array], { type: contentType });
};

修改上传函数,区分Web和移动端的输入类型:

const uploadPhoto = async (photo) => {
  if (!photo) return null;

  let blob;
  // 处理Web端的base64数据
  if (photo.base64) {
    blob = base64ToBlob(photo.base64, photo.type);
  } 
  // 处理移动端的uri数据
  else if (photo.uri) {
    blob = await new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.onload = () => resolve(xhr.response);
      xhr.onerror = (e) => {
        console.error(e);
        reject(new TypeError("Network request failed"));
      };
      xhr.responseType = "blob";
      xhr.open("GET", photo.uri, true);
      xhr.send(null);
    });
  } else {
    console.error("无效的图片数据格式");
    return null;
  }

  try {
    const fileRef = ref(getStorage(), uuidv4());
    const uploadResult = await uploadBytes(fileRef, blob);
    return uploadResult;
  } catch (err) {
    alert(err.message);
    return null;
  }
};

iOS模拟器JSON格式错误问题

这个错误是因为你误将Web端的base64逻辑用到了iOS端——iOS返回的是uri,但如果代码错误地把base64传入XHR,XHR会把它当作无效URL请求,返回的错误响应被序列化成了JSON格式(看起来像base64数据,实际是错误信息)。

按照上面的代码区分平台输入后,iOS端只会处理uri,这个问题就会消失。

关于Expo ImagePicker平台差异的疑问

Web端返回base64、移动端返回uri是Expo ImagePicker的设计特性:Web浏览器受同源策略和文件访问限制,无法直接获取本地文件路径,只能返回base64;移动端系统允许直接访问本地文件,所以返回uri。

官方指南未提及可能是因为示例仅针对单端场景,或者默认开发者会查阅平台特定的API文档。这个差异必须针对性处理,否则会直接导致上传逻辑失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:45:26