我正在使用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图像选择器返回本地文件的内容?
答案 0 :(得分:0)
在寻找解决方案时,我遇到了this post。解释很彻底。这是TL; DR。 。
从RN 0.57开始,它们用于提取的polyfill不再将xhr.responseType默认为blob
。 React 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();
}