[英]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 库上传视频,我会遇到两个问题:
如果尝试使用从图像选择器库中获得的链接直接上传视频,则会发生此错误。
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');
但是这个解决方案只适用于小文件。 对于较长的视频,应用程序崩溃,我收到以下错误。
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.