您好StackOverflow和Firebase社区!
我正在尝试实现Firebase可能无法实现的目标:我想在Firebase Storage中存储HTML文件夹(本例中为横幅广告)。
我的问题是:如何保持从HTML文件到相关JS和图像文件的相对路径。
因此,这些文件可以轻松找到彼此:
/path/to/my/folder/index.html
/path/to/my/folder/main.js
/path/to/my/folder/picture.jpg
<html>
...
<script src="main.js">
...
</html>
document.onload = function() {
myImage.src = 'picture.jpg'
}
如果我将所有文件存储在Firebase Storage上,并使用它们的DownloadURL(看起来像https://firebasestorage.googleapis.com/v0/b/my-project.appspot.com/o/my_folder_300x250%2Findex.html?alt=media&token=12a123a1-1234-1a1a-1234-a1ab123456a1
,
通过打开Firebase的安全规则,我可以使文件无需令牌即可访问,但是由于URL参数和相对路径被转义,相对路径仍然被破坏。
我还通过公开了Google Cloud Storage存储桶,使其可以在其他项目上使用。我可以使用https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html
这样的URL访问文件并保留相对路径。这很好用,但是有主要的安全漏洞,我想阻止它,例如列出存储桶中的所有文件
我试图将横幅保存为zip文件,在前端将其解压缩,然后使用FileSystem API在浏览器中重新创建文件夹结构。但是我仅限于Chrome。
我也可以尝试替换HTML,JS和CSS文件中的所有URL,但这并不是一个好的解决方案。
答案 0 :(得分:0)
Firebase Storage围绕Cloud Storage构建,Cloud Storage实际上没有目录,而是一个平面命名空间。目录通过存储对象命名约定进行仿真:名称可以包含/
字符,并在对象名称的开头放置“目录”路径,使该对象看起来像在该“目录”中。看到
How Subdirectories Work。
因此,您唯一的解决方案(如果要独立存储文件)是处理所有引用,将“路径”设为绝对,并相应地命名文件。如您所见,您可能还需要考虑所有URL查询参数。
答案 1 :(得分:0)
我找到了一个非常简单的解决方案:
我在Google Cloud Console中创建了一个具有访问权限但没有列表访问权限的新角色,并将其应用于具有以下权限的allUsers
。
resourcemanager.projects.get
storage.objects.get
这将暂时解决我的问题,我将继续使用https://my-project.appspot.com.storage.googleapis.com/path/to/my/folder/my_folder_300x250/index.html
之类的链接访问数据,而不是使用Firebase的downloadURL()。