【问题标题】:Difference between media link from firebasestorage.googleapis.com and storage.googleapis?firebasestorage.googleapis.com 和 storage.googleapis 的媒体链接之间的区别?
【发布时间】: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&amp;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&amp;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


    【解决方案1】:

    云功能中使用的firebase-admin 没有区别,它会给你一个storage 的链接,而如果你从客户端使用firebase,那么你会得到一个firebasestorage 的链接。

    但是这两个选项都会将图像发送到同一个 firebase 存储,这就是为什么您可以使用 firebasestorage 访问从 firebase 管理员上传的图像

    【讨论】:

    • 所以我可以互换使用两个 API 链接?注意:从firebase-admin 上传的图片无法在 Firebase 存储控制台中加载图片预览,这很奇怪。使用firebase 客户端 SDK 上传的所有图像在控制台中都有正常预览。我创建了一张支持票,询问他们。感谢您的回答!
    • 除了@Peter Haddad 的回答之外,这种行为是正常的,因为 firebase 使用 GCP 云存储桶,这是 gcp 存储 www.googleapis.com/storage 的域,这是 firebase firebasestorage.googleapis.com两者都使用不同的域指向同一个存储桶。
    • 这些链接在功能上不等效。有关详细信息,请参阅我的答案。
    【解决方案2】:

    链接不等效。下载 URL 由 Firebase 客户端 SDK 专门生成,并包含授权客户端下载的特殊令牌。可以在 Firebase 控制台中撤销此令牌以防止进一步访问。此类 URL 在 Google Cloud Platform 中没有 100% 相似的概念。 GCP 中最相似的概念是signed URLs,但签名 URL 具有更多功能。

    据我所知,Medialink URL 没有携带太多文档,因此它们显然只是用于对对象的公共访问。他们显然可以调出对象的特定版本。 Firebase 下载 URL 无法执行此操作 - 它们始终访问对象的最新版本。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 2014-05-27
      • 2013-02-12
      • 1970-01-01
      • 2019-04-21
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多