【问题标题】:Upload base64 Image to Firebase React native将 base64 图像上传到 Firebase React native
【发布时间】:2021-09-28 20:51:25
【问题描述】:

我尝试在 iOS 上使用 React Native 将“base64”图像上传到 Firebase。但是当我尝试上传图片时,出现以下错误:

undefined 不是一个对象(评估 'uri.substring')

我使用route.params 获取我的图像,如果我在这样的视图中显示图像,则会显示图像。

<Image style={styles.image} source={{ uri: `data:image/png;base64,${myImage}` }}/>

如果图像是“base64”,我应该做其他事情还是我应该做什么?

这是我的代码:

// Here is how I get the image
const { myImage } = props.route.params;

const uploadImage = async () => {
  const {uri} = myImage;
  const filename = uri.substring(uri.lastIndexOf('/') + 1);
  const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
  setUploading(true);

  setTransferred(0);
  const task = storage()
    .ref(filename)
    .putFile(uploadUri);
  // set progress state
  task.on('state_changed', snapshot => {
    setTransferred(
      Math.round(snapshot.bytesTransferred / snapshot.totalBytes) * 10000
    );
  });
  try {
    await task;
  } catch (e) {
    console.error(e);
  }
  setUploading(false);
  Alert.alert(
    'Photo uploaded!',
    'Your photo has been uploaded to Firebase Cloud Storage!'
  );
};

【问题讨论】:

  • 我更新了我的问题。
  • 那么result是一个包含base64编码字符的字符串?
  • 是的,没错!

标签: javascript firebase image react-native firebase-storage


【解决方案1】:

查看您当前的代码,您从props.route.params中取出myImage,这是一个与PNG图像对应的Base 64字符字符串(例如iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAMSURBVBhXY/j//z8ABf4C/qc1gYQAAAAASUVORK5CYII= - 单个PNG的数据# FFFFFF 像素)。

const { myImage } = props.route.params;

在下面,您尝试从 myImage 字符串中获取属性 uri。由于此属性不存在,您将获得undefined。然后,此 uri = undefined 值会在下一行引发错误。

const { uri } = myImage; // uri is undefined! ("".uri === undefined)
const filename = uri.substring(uri.lastIndexOf('/') + 1); // throws error!

上传数据 URL 的正确方法是使用documentation here 中介绍的Reference#putString() 方法。

将此应用于您的代码,您将使用:

const { myImage } = props.route.params;

const uploadImage = async () => {
  const dataUrl = `data:image/png;base64,${myImage}`;

  // you could use a Firestore Doc ID, a RTDB Push ID or
  // some `uuid` implementation to generate a suitable filename.
  const storageRef = storage()
    .ref(/* provide a path for the image */);

  const uploadTask = storageRef
    .putString(dataUrl, 'data_url');

  uploadTask.on('state_changed', snapshot => {
    setTransferred(
      Math.round(snapshot.bytesTransferred / snapshot.totalBytes) * 10000
    );
  });

  try {
    await uploadTask;
    
    setUploading(false);
    Alert.alert(
      'Photo uploaded!',
      'Your photo has been uploaded to Firebase Cloud Storage!'
    );
  } catch (err) {
    // TODO: Check value of `err.code` and handle appropriately.
    console.error('Upload failed: ', err);
    Alert.alert(
      'Photo upload failed!',
      'Your photo didn\'t upload properly!'
    );
  }
}

为防止覆盖其他人的数据并使安全规则更易于实施,您应在上传的文件前加上类似于以下内容的用户 ID:

const storageRef = storage()
    .ref('userUploads')
    .child(firebase.auth().currentUser.uid)
    .child(/* generated image ID */);

// builds a reference to /userUploads/someUserId/someImageId

【讨论】:

  • 感谢您的回答,非常感谢。我将此路径添加到“参考”。 const childPath = paintBoards/${ auth().currentUser.uid }/${Math.random().toString(36)};但是当我尝试上传时,它会抛出一个错误,例如:错误:[存储/未知]发生了未知错误。
  • @Alexander 通常Cloud Storage Error Codes 比这更有用。由于错误为storage/unknown,原因尚不清楚,您需要联系Firebase Support 了解详情。它可以是一个简单的Cloud Storage Security Rules permissions problem
  • 我将安全规则更改为“允许读取,写入:如果为真;”。但它仍然给我一个错误。当安装一个新的 npm 包时,我得到了这个 tw 警告:@react-native-firebase/storage@12.2.0 需要 @react-native-firebase/app@12.2.0 的对等点,但没有安装......并且[!] NPM 包 '@react-native-firebase/storage' 依赖于 '@react-native-firebase/app' v12.2.0 但发现 v12.1.0,这可能会导致构建问题或运行时崩溃。我已经运行了 npm 和 pod install。
  • 您的package.json 文件中似乎定义了两个版本的@react-native-firebase/storage。一个专门命名 v12.2.0,另一个使用最新的(也是 v12.2.0)。在package.json 中,您还有@react-native-firebase/app@12.1.0,应该更新为@react-native-firebase/app@12.2.0 或简单的@react-native-firebase/app。因为不是客户端权限错误,所以一定是服务器端权限错误。
  • 嗯,好吧,我该怎么办?我已经删除/重新安装了这个包,但它仍然给我同样的错误。我还能做什么?
猜你喜欢
  • 2020-03-23
  • 2022-10-18
  • 2018-01-14
  • 2020-03-06
  • 2017-07-02
  • 2020-06-21
  • 1970-01-01
  • 2023-03-31
  • 2021-06-07
相关资源
最近更新 更多