使用React Native Fetch API在Android上获取图片

时间:2019-05-02 17:44:16

标签: react-native fetch expo

我正在使用React Native和Expo。我正在使用Expo图像选择器,该选择器将本地URI返回到图像文件。返回的URI如下所示: file:///data/user/0/com.myapp/cache/ExperienceData/%2540myapp%252Fmyapp/ImagePicker/c5a29113-7c8f-4224-99ec-007f641841ee.jpg

在iOS上,我可以使用React Native Fetch API来获取Blob,因此可以使用Amplify Storage Service将其上传到S3。一切正常。

但是,在Android上,它不起作用。 fetch命令返回1而不是响应。没有错误。

我不能使用(嗯,不想使用)rn-fetch-blob,因为我的应用程序已分离,并且需要修补rn-fetch-blob才能与Expo 32配合使用。

但是有趣的是...如果我不是使用图像缩放器的URI,而是使用网络中的图像URL,那么它可以在Android和iOS上使用。那么,如何在Android上使用提取功能以从Android图像选择器返回本地文件的内容?

1 个答案:

答案 0 :(得分:0)

在寻找解决方案时,我遇到了this post。解释很彻底。这是TL; DR。 。

从RN 0.57开始,它们用于提取的polyfill不再将xhr.responseType默认为blobReact Native for Android BlobModule检查响应类型,以确定它是否不是HTTP或https请求时是否可以处理URL。由于responseType从不为'blob',因此该模块从不处理请求,并且引发类型错误。 。 。在android上。 。 。用于文件请求。 。 。通过whatwg-fetch.js polyfill。 。 。 RN为0.57 +。

基于前面提到的关于博览会的帖子,我将其添加为(希望)临时解决方案。

requestBlob = (uri) => {
  return new Promise((resolve, reject) => {
    let xhr = new XMLHttpRequest();
    xhr.onload = () => resolve(xhr.response);
    xhr.onerror = () => reject(new TypeError('Network request failed'));
    xhr.responseType = 'blob';

    xhr.open('GET', uri, true);
    xhr.send(null);
  });
}

我要这样保存图片:

  let body, storedImage;
  try {
    body = await requestBlob(localImageUri).catch(error => errors.push(error));
    storedImage = await Storage.put(path, body).catch(error => errors.push(error));
  } finally {
    body.close();
  }