【发布时间】:2020-04-11 05:57:51
【问题描述】:
我需要将图像上传到 Firebase 存储并获取一个下载 URL 以使用作为我的网络应用中 <img src=""/> 标记的 src。
当我使用firebase 客户端 SDK从浏览器将图像上传到我的存储桶时,我会这样做:
const fileName = "someImage.jpg";
const storageRef = firebase.storage().ref('my-images/' + fileName);
const uploadTask = storageRef.put(file,metadata); // I GET THE FILE FROM AN <input type="file"/>
这是我如何获取最近上传文件的下载网址:
const downloadURL = await uploadTask.snapshot.ref.getDownloadURL();
我得到一个 如下所示的下载 URL:
https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg?alt=media
现在我正在使用 firebase-admin 通过 Node 脚本上传图像,这就是我正在做的事情:
async function uploadImage() {
const filePath = "./src/assets/someImage.jpg";
const fileName = "someImage.jpg";
const options = {
destination: '/my-images/' + fileName,
public: true,
metadata: {
cacheControl: 'public,max-age=86400,must-revalidate'
}
};
return new Promise((resolve,reject) => {
admin.storage().bucket().upload(filePath,options) // <------ UPLOAD THE IMAGE
.then((file) => resolve(file))
.catch((err) => reject(err));
});
}
uploadImage()
.then((file) => console.log(file)) // <---- THIS LOGS THE RESPONSE
.catch((err) => console.log(err));
这是它已登录的响应.then() 子句:
还有其他日志,但这是重要的部分:
File {
metadata: {
kind: 'storage#object',
id: 'my-project.appspot.com/my-images/someImage.jpg/1576651561918519',
selfLink: 'https://www.googleapis.com/storage/v1/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg',
name: 'my-images/someImage.jpg',
bucket: 'my-project.appspot.com',
generation: '1576651561918519',
metageneration: '1',
contentType: 'image/jpeg',
storageClass: 'STANDARD',
size: '8724',
mediaLink: 'https://storage.googleapis.com/download/storage/v1/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg?generation=157621651561918519&alt=media',
cacheControl: 'public,max-age=86400,must-revalidate',
},
我从mediaLink 属性获取下载URL:
mediaLink: 'https://storage.googleapis.com/download/storage/v1/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg?generation=157621651561918519&alt=media',
我发现这两个链接都可以使用作为我的src 标签的src。
选项 A(来自 firebase 客户端 SDK):
https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg?alt=media
选项 B(来自 firebase-admin SDK):
https://storage.googleapis.com/download/storage/v1/b/my-project.appspot.com/o/my-images%2FsomeImage.jpg?generation=157621651561918519&alt=media
而且我还注意到,我可以使用从浏览器上传文件时获得的相同的firebasestorage API 链接访问使用firebase-admin 上传的文件。我只需要替换文件名,例如:
"https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my-images%2F" + "WHATEVER_FILE_NAME.jpg" + "?alt=media"
问题
选项 A 的链接(使用浏览器上的 firebase SDK 上传生成)和选项 B 的链接(使用 Node 脚本的 firebase-admin SDK 上传生成)有什么区别?
【问题讨论】:
标签: node.js firebase google-cloud-storage firebase-storage firebase-admin