【问题标题】:Uploading a video from the android gallery to Firebase Storage with react-native使用 react-native 将视频从 android 库上传到 Firebase Storage
【发布时间】:2022-01-03 19:44:05
【问题描述】:

我目前正在开发一个 react-native 项目,用户可以将视频从他的应用上传到 firebase 存储
用户可以从他的库中选择一个视频,也可以直接在应用程序中获取一个新视频。我使用react-native-image-picker 库。
在 IO 上,一切都按预期工作。在 Android 上,我只能上传直接在应用中拍摄的视频或 小视频 从 android 图库。


如果我尝试从 android 图库上传视频,我会遇到两个问题

  1. 错误:[存储/未知]权限被拒绝:从 pid=32673,uid= 读取 com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/video:723 10226 要求您使用 ACTION_OPEN_DOCUMENT 或相关 API 获得访问权限

如果尝试使用我从图像选择器库中获得的链接直接上传视频,则会出现此错误。

   let reference = storage().ref(path);
   let task = reference.putFile(imagePickerResponse.assets[0].uri);

我设法通过使用 RNFS 库解决了这个问题。 react-native-fs

   const data = await RNFS.readFile(imagePickerResponse.assets[0].uri, 'base64');
   let task = reference.putString(data, 'base64');

但此解决方案仅适用于小文件。对于较长的视频,应用程序崩溃,我收到以下错误。

  1. 无法调用 RNFSManager.readFile
Could not invoke RNFSManager.readFile

null

Failed to allocate a 268435472 byte allocation with 
6291456 free bytes and 116MB until OOM, target 
footprint 152234472, growth limit 268435456

很遗憾,我在网上找不到任何解决方案。 有没有办法将大视频从 Android 库上传到 Firestore 存储?


图像选择器代码

export const SelectVideoAction: CameraAction = {
  title: 'Select Video',
  type: 'library',
  options: {
    selectionLimit: 0,
    mediaType: 'video',
  },
};
launchImageLibrary(SelectVideoAction.options, handleResponse);

Android 上传代码

let reference = storage().ref(targetPath);
let task = reference.putFile(imagePickerResponse.assets[0].uri);
if (Platform.OS === 'android' && fromLibrary) {
  const data = await RNFS.readFile(imagePickerResponse.assets[0].uri, 'base64');
  task = reference.putString(data, 'base64');
}

task
  .then(() => {
     console.log('Image uploaded to the bucket!');
  })
  .catch((e) => console.log('uploading image error => ', e));

依赖关系

"dependencies": {
...
    "react": "17.0.2",
    "react-native": "0.66.3",
    "react-native-image-picker": "^4.0.6",
    "react-native-fs": "^2.18.0",
...
}

【问题讨论】:

    标签: android react-native firebase-storage react-native-image-picker


    【解决方案1】:

    主要思想是将大视频文件分割成块,这样不会超过设备的内存限制,并提供更系统的上传过程。解决方案的描述听起来不错,但实施起来可能非常困难。

    有一个包可以做块操作:React Native Chunk Upload。 firebase 存储的默认版本是否允许块上传操作或此包与 firebase 兼容?我不确定,但你可以试试Uploading large files on web using Firebase。您必须更改 firebase 端和 android 权限的一些配置,这在文档中有所提及。

    归根结底,您可以考虑使用更合适/更强大的视频存储/流媒体服务。 (Google Cloud Storage (Multiple Chunk Upload), Cloudflare Stream, 多路复用器)

    我意识到这不是一个完整的答案,但我想分享它,因为它可能对您或其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 2020-04-10
      • 2020-08-16
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多