我试图了解令牌如何在Firebase存储中运行。
每当我的网络应用程序将图像上传到FS时,它都会向其公共网址添加一个令牌。问题是,无论何时将相同的图像文件上传到Web应用程序的另一部分,您似乎都没有获得另一个文件,但是已经上传的文件URL的标记不同,从而导致403错误以前注册的图像显示。
有没有办法解决这个问题?
示例:
storageRef.put(picture.jpg);
uploadTask.snapshot.downloadURL
// returns something like https://firebasestorage.googleapis.com/v0/b/<your-app>/o/picture.jpg?alt=media&token=09cb2927-4706-4e36-95ae-2515c68b0d6e
然后将该url显示在img src中的某个位置。
<img src="https://firebasestorage.googleapis.com/v0/b/<your-app>/o/picture.jpg?alt=media&token=09cb2927-4706-4e36-95ae-2515c68b0d6e">
如果用户重复该过程并在应用的另一部分上传相同的picture.jpg,而不是在Firebase存储中获取全新的副本,则该文件将被以新标记结尾的URL覆盖;说12345。
所以:
<img src="https://...picture.jpg?alt=media&token=12345"> // New upload renders fine
<img src="https://...picture.jpg?alt=media&token=09cb2927-4706..."> // But old upload breaks because of wrong url
答案 0 :(得分:10)
令牌对于特定版本的上传而言是唯一的。如果您使用新内容覆盖该文件,则会生成一个新的令牌,其中包含一个新的无法访问的网址。
因此换句话说,令牌对于特定blob是唯一的 - 它们不是每个存储位置唯一的。我们这样做是为了增加安全措施,以确保开发人员和最终用户不会意外地暴露他们不想要的数据。
但是,您可以使用我们的js SDK将存储位置(“gs://mybucket/myfile.png”)转换为下载URL。这样,您可以根据需要传递gs uri,并在想要将其放入图像后将其转换为完整的URL。
请参阅:https://firebase.google.com/docs/reference/js/firebase.storage.Reference.html#getDownloadURL
答案 1 :(得分:0)
对于公共文件上传:如果您在 firebase函数中上传文件,则需要在参考对象上调用makePublic()
,以使其在没有有效令牌的情况下可以访问。 / p>