我正在尝试将视频上传到 iOS 上的 Firebase 存储。 Android 工作正常。这是导致它的代码(代码中有注释显示它何时崩溃)。此外,我正在使用我自己的 iPhone 来测试它,而不是模拟器。
export const mediaUpload = async (imageObject) => {
// getting blob from a local file a user uploads from ImagePicker
const blob = await fetch(imageObject[0].uri);
const blobObject = await blob.blob();
// creating reference path in storage
const fileRef = ref(storage, `${auth.currentUser.uid}/videos/${uuid.v4()}`);
// ----- no crash so far... -------
// this is the issue line
const attemptToUpload = await uploadBytes(fileRef, blobObject);
// ------> APP CRASHES
}
在 Android 上,这适用于图像和视频。在 iOS 上,图像可以工作,但视频会使应用程序完全崩溃。 blob 类型是 video/quicktime。为什么 uploadBytes 方法会使应用程序崩溃?
编辑:答案是 Firebase v9 似乎与 Expo 在处理视频上传到存储 100% 方面不兼容。甚至 android 在视频上传时挂起,我发现没有任何错误消息。我解决这个问题的方法是回到 Firebase 8.10.0 版本。这 100% 有效。
最佳答案
使用这种方法并在 iOS 15 上运行良好。
const videoRef = firebase.storage().ref("video/filename");
const metadata = { contentType: "video/mp4" };
const blob = await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = function () {
resolve(xhr.response);
};
xhr.ontimeout = function (e) {
// XMLHttpRequest timed out. Do something here.
console.log(e);
};
xhr.onerror = function (e) {
console.log(e);
reject(new TypeError("Network request failed"));
};
xhr.responseType = "blob";
xhr.open("GET", fileUri, true);
xhr.timeout = 1000 * 60;
xhr.send(null);
});
var uploadTask = videoRef.put(blob, metadata);
uploadTask.on(
"state_changed",
(snapshot) => {
// Observe state change events such as progress, pause, and resume
// Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
const progress = snapshot.bytesTransferred / snapshot.totalBytes;
switch (snapshot.state) {
case firebase.storage.TaskState.PAUSED: // or 'paused'
console.log("Upload is paused");
break;
case firebase.storage.TaskState.RUNNING: // or 'running'
console.log("Upload is running");
break;
}
},
(error) => {
console.log(error);
// Handle unsuccessful uploads
blob.close();
},
() => {
// Handle successful uploads on complete
// For instance, get the download URL: https://firebasestorage.googleapis.com/...
uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {
console.log("Video file save at:",downloadURL)
});
blob.close();
}
);
关于javascript - 将视频上传到 Firebase 存储时,iOS 上的 Expo 应用程序崩溃。适用于 Android,不适用于 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70603238/