node.js - 来自 firebasestorage.googleapis.com 和 storage.googleapis 的媒体链接之间的区别?

标签 node.js firebase google-cloud-storage firebase-storage firebase-admin

我需要将图像上传到 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/

相关文章:

node.js - 使用 SailsJS/Express 在请求之间将对象保存在内存中

swift - 如何在流式传输时从 firebase 保存音频文件

android - 禁用 InjectMappingFiledId 任务

google-cloud-platform - 在 Google Cloud Platform 中安排 Cloud DataStore 导出

google-cloud-storage - 谷歌云存储是一个自动的全局 CDN 吗?

Node.js: radio 流媒体 API

javascript - 不要等待函数完成

html - 类型错误 : Cannot read property 'File' of undefined

javascript - 使用 gcs 上传签名 URL 的图像上传问题 | react JS

android - 非 Root Android 上的 Node.js