无法将 react-native-camera TakePictureResponse 上传到 Firebase 存储

Posted

技术标签:

【中文标题】无法将 react-native-camera TakePictureResponse 上传到 Firebase 存储【英文标题】:Cannot upload react-native-camera TakePictureResponse to Firebase Storage 【发布时间】:2020-08-31 12:49:50 【问题描述】:

我正在尝试使用 react-native-camera 拍摄照片,然后将该照片上传到 Firebase 存储。我可以使用 RNFetchBlob 将文件作为 blob 检索,但是当尝试将 .put() 放入 Firebase 存储时,我得到一个

Firebase 存储:索引 0 处的 put 中的参数无效:预期的 Blob 或文件。

我还尝试使用 .putString() 并将其作为 base64 字符串或只是 uri 传递,但是我遇到了类似的问题。这是一些相关的代码。

export function createPhoto(photo: TakePictureResponse): Boolean 
  var ref = storage.ref();
  var photoRef = ref.child('photos');
  if (Platform.OS === 'ios') 
    var filePath = photo.uri.replace('file:', '');
   else 
    filePath = photo.uri.split('raw%3A')[1].replace(/\%2F/gm, '/');
  
  RNFetchBlob.fs.readFile(filePath, 'base64').then((data) => 
    photoRef.put(data).then((snapshot) => 
      console.log('Uploaded a photo');
      console.log(snapshot.downloadURL);
    );
  );

更新:RNFetchBlob.fs.readFile() 根据您选择的解码器选项返回一个字符串(对于本示例,它是 base64)。但是我仍然有问题,因为 Firebase 存储将不接受带有 .putString(data, 'base64') 的 base64 字符串。我收到"Firebase Storage: String does not match format 'base64': Invalid character found" 错误。

【问题讨论】:

您当前的代码传入一个字符串,put 不接受该字符串。虽然调用 putString 也可能不起作用,但错误消息可能会有所不同,putString 是调用其余代码的正确消息。 所以我从您的回复中了解到,RNFetchBlob.fs.readFile() 返回一个存储在“数据”中的字符串。我的印象是它从作为参数给出的文件路径中返回了一个 blob。所以这个字符串只是图片的base64表示? 您可能需要阅读文档以了解它返回的内容。也许这就是你正在使用的? github.com/joltup/rn-fetch-blob/wiki/… @Doug Stevenson 我阅读了文档,我收集到的只是它返回了一个承诺,如果使用 .then 运算符,我会收到除此之外没有更多信息的“数据”。除非我弄错了,误读了。 您已经告诉 API 您需要 base64 数据,这是一个字符串。编码参数的说明是:“解码文件数据的解码器,应该是base64、ascii、utf8之一,默认使用utf8。”。这些都将是字符串。 【参考方案1】:

由于我使用的是 React Native,我遇到问题的原因已在此处的另一篇文章中得到解答。 https://***.com/a/52174058/7842007

这基本上与 react native 无法处理 firebase 存储使用的 atob 和 btoa 有关,因此您必须使用诸如“encode-64”之类的库在 index.js 中进行设置' 或通过创建自己的库。

【讨论】:

以上是关于无法将 react-native-camera TakePictureResponse 上传到 Firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章

react-native-camera 将图像 base64 转换为 jpeg

安装 React-Native-camera 后无法构建

react-native-camera 无法读取 android 上未定义的属性“常量”

添加 React-Native-Camera 和 React-Native-Push-Notification 后无法构建 React Native

gradlew assembleRelease 不适用于 react-native-camera

如何将捕获的图像与 react-native-camera 一起使用