我需要将图像上传到 Firebase 存储并获取要使用的下载 URL 作为 src
对于 <img 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"/>
这就是我如何获取最近上传文件的下载 URL:
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
对于我的 <img src="URL"/>
标签。
选项 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
我还注意到我可以访问我用 firebase-admin
上传的文件通过使用相同的 firebasestorage
从浏览器上传文件时获得的 API 链接。我只需要替换文件名,例如:
"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 从上传生成)有什么区别?
最佳答案
云函数中使用的 firebase-admin
没有区别,它会给你一个与 storage
的链接,而如果你从客户端使用 firebase,那么你会获取与 firebasestorage
的链接。
但是这两个选项都会将图像发送到相同的 firebase 存储,这就是为什么您也可以使用 firebasestorage
访问从 firebase admin 上传的图像
关于node.js - 来自 firebasestorage.googleapis.com 和 storage.googleapis 的媒体链接之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59396130/