繁体   English   中英

使用 react-native 将视频从 android 库上传到 Firebase 存储

[英]Uploading a video from the android gallery to Firebase Storage with react-native

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


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

  1. Error: [storage/unknown] Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/video:723 from pid=32673, uid=10226 requires that您使用 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",
...
}

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

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

归根结底,您可以考虑使用更合适/更强大的视频存储/流媒体服务。 谷歌云存储(多块上传)Cloudflare Stream ,Mux)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM