我使用 React Native Image Picker Library 从手机图库中获取图像,这些图像采用 base64 格式,当我尝试将它们上传到 firebase 存储时,它们不显示,我尝试了各种解决方案,但它们都不起作用是:
const response = await fetch(result.assets[0].uri)
const blob = response.blob()
uploadBytes(imgRef, blob).then((snapshot)=>{
getDownloadURL(ref(storage, result.assets[0].fileName))
.then((url) => {
url_ = url;
userDetails.update_details("image_1", url_);
})
})
这个存储一个八位字节流
const binaryData = Buffer.from(result.assets[0].base64, "base64");
const blob = new Blob([binaryData], { type: 'image/png' });
uploadBytes(imgRef, blob).then((snapshot)=>{
getDownloadURL(ref(storage, result.assets[0].fileName))
.then((url) => {
url_ = url;
userDetails.update_details("image_1", url_);
})
})
这会将图像保存为 png,但它不会在 firebase 控制台上打开。
我没有测试你的代码,但我可以看到你错过了 Promises 链中的返回:
uploadBytes(imgRef, blob)
.then((snapshot) => {
return getDownloadURL(ref(storage, result.assets[0].fileName)); // <==
}) // <==
.then((url) => {
url_ = url;
userDetails.update_details("image_1", url_);
});
如链接文档中所述:
始终返回结果,否则回调将无法捕获结果 之前的承诺.
使用 React Native 将 Base64 格式的图像上传到 Firebase Storage 时,需要注意一些常见的陷阱。让我们一步步分解这个过程:
将 URI 转换为 Blob: 您需要将图像 URI(从图像选择器获取)转换为 blob。这是必要的,因为 Firebase Storage 需要上传 blob 或文件。
上传到 Firebase 存储: 获得 Blob 后,您可以继续将其上传到 Firebase 存储。
检索下载网址: 上传完成后,如果您想稍后访问或显示图像,您应该检索下载 URL。
以下是实现此目的的更详细方法:
import storage from '@react-native-firebase/storage';
import { Platform } from 'react-native';
async function uploadImage(uri, fileName) {
try {
// Convert image uri to blob
const response = await fetch(uri);
const blob = await response.blob();
// Create a reference to Firebase Storage
const ref = storage().ref(fileName);
// Upload the blob to Firebase Storage
const taskSnapshot = await ref.put(blob);
// Get the download URL
const downloadURL = await taskSnapshot.ref.getDownloadURL();
console.log('Image URL:', downloadURL);
return downloadURL;
} catch (error) {
console.error("Upload error:", error);
throw error;
}
}
// Usage:
const imageUri = result.assets[0].uri;
const fileName = result.assets[0].fileName || 'imageFileName.png'; // Ensure there's always a fallback name
uploadImage(imageUri, fileName)
.then(url => {
console.log("Image uploaded successfully:", url);
userDetails.update_details("image_1", url);
})
.catch(error => {
console.error("Failed to upload image:", error);
});
注释:
async/await
模式在这里很有用。<Image>
组件的 source
属性中使用返回的下载 URL。