我正在嘗試將視頻上傳到 iOS 上的 Firebase 存盤。安卓作業得很好。這是導致它的代碼(代碼中有注釋以顯示它何時崩潰)。另外,我使用我自己的 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 在處理視頻上傳到存盤 100% 時似乎與 Expo 不兼容。甚至 android 也掛在視頻上傳上,我發現沒有任何錯誤訊息。我解決這個問題的方法是回到 Firebase 8.10.0 版本。這 100% 有效。
uj5u.com熱心網友回復:
使用這種方法并在 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();
}
);
uj5u.com熱心網友回復:
我認為ios當 body 只是一個 blob 時,這是平臺上的一個已知問題。幾周前我遇到了同樣的問題,我通過將它發送到我的后端然后上傳到需要它的服務來修復它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404441.html
標籤:
