在使用Firebase的函数在Firebase存储中上载一个文件后,我想获取该文件的下载url
我有这个:
...
return bucket
.upload(fromFilePath, {destination: toFilePath})
.then((err, file) => {
// Get the download url of file
});
对象文件有很多参数。甚至一个名为mediaLink
的。但是,如果我尝试访问此链接,则会出现以下错误:
Anonymous users does not have storage.objects.get access to object ...
有人能告诉我如何获取公共下载Url吗
多谢各位
下面是一个关于如何在上载时指定下载令牌的示例:
然后打电话给我
这里的关键是
metadata
选项属性中嵌套了一个metadata
对象。将firebaseStorageDownloadTokens
设置为uuid-v4值将告诉云存储将其用作其公共身份验证令牌非常感谢@Martemorphosis
此答案将总结将文件上载到Google/Firebase云存储时获取下载URL的选项。有三种类型的下载URL:
有三种方法可以获取令牌下载URL。其他两个下载URL只有一种方法可以获取它们
从Firebase存储控制台
您可以从Firebase存储控制台获取下载URL:
下载URL如下所示:
第一部分是文件的标准路径。最后是代币。此下载URL是永久的,即不会过期,但您可以撤销它
从前端获取下载URL()
documentation告诉我们使用
getDownloadURL()
:这与您可以从Firebase存储控制台获得的下载URL相同。这种方法很简单,但需要知道文件的路径,在我的应用程序中,对于一个相对简单的数据库结构,大约需要300行代码。如果您的数据库很复杂,这将是一场噩梦。你可以从前端上传文件,但这会让下载你的应用的任何人暴露你的凭证。因此,对于大多数项目,您都希望从节点后端或谷歌云功能上传文件,然后获取下载URL并将其与文件的其他数据一起保存到数据库中
getSignedUrl()用于临时下载URL
getSignedUrl()易于从节点后端或谷歌云功能使用:
签名下载URL如下所示:
签名的URL具有过期日期和长签名。命令行gsutil signurl -d的文档说明,签名URL是临时的:默认过期时间为一小时,最大过期时间为七天
我要在这里大声说getSignedUrl从来没有说过你的签名URL将在一周内过期。文档代码将
3-17-2025
作为过期日期,这表明您可以在将来设置过期年份。我的应用程序工作正常,一周后崩溃了。错误消息说签名不匹配,而不是下载URL已过期。我对我的代码做了各种各样的修改,一切正常……直到一周后全部崩溃。这种情况持续了一个多月的沮丧公开您的文件
您可以将文件的权限设置为公共读取,如documentation中所述。这可以通过云存储浏览器或节点服务器完成。您可以将一个文件或目录或整个存储数据库公开。以下是节点代码:
在云存储浏览器中,结果如下所示:
然后,任何人都可以使用标准路径下载您的文件:
另一种公开文件的方法是使用方法makePublic()。我还没能让它正常工作,要使bucket和文件路径正确是很困难的
一个有趣的替代方法是使用Access Control Lists。您可以使文件仅对您在列表中列出的用户可用,或者使用
authenticatedRead
使从Google帐户登录的任何人都可以使用该文件。如果有一个选项“任何使用Firebase Auth登录我的应用程序的人”,我会使用这个选项,因为它将仅限制我的用户访问使用firebaseStorageDownloadTokens构建您自己的下载URL
有几个答案描述了一个未记录的Google存储对象属性
firebaseStorageDownloadTokens
。有了它,您可以告诉存储您想要使用的令牌。您可以使用uuid
节点模块生成令牌。四行代码,您可以构建自己的下载URL,相同的dow从控制台或getDownloadURL()
获取的nload URL。这四行代码是:以下是上下文中的代码:
这不是打字错误--你必须把
firebaseStorageDownloadTokens
嵌套在双层metadata:
中Doug Stevenson指出
firebaseStorageDownloadTokens
不是Google官方的云存储功能。你在谷歌的任何文档中都找不到它,也不能保证它会出现在未来版本的@google-cloud
。我喜欢firebaseStorageDownloadTokens
,因为这是唯一能得到我想要的东西的方法,但它有一种“气味”,使用起来不安全为什么没有来自节点的getDownloadURL()?
正如@Clinton所写,谷歌应该在
@google-cloud/storage
(即,您的节点后端)中创建一个file.getDownloadURL()
a方法。我想从谷歌云功能上传一个文件,并获得令牌下载URL您需要通过@google-cloud/storageNPM模块使用getSignedURL生成一个签名URL
例如:
您需要使用your service account credentials初始化
@google-cloud/storage
,因为应用程序默认凭据不足更新:现在可以通过Firebase管理SDK访问云存储SDK,该SDK位于@google Cloud/Storage附近。唯一的方法是,如果您:
相关问题 更多 >
编程相关推荐