firebase - 如何从谷歌存储加载文件
问题描述
我想显示保存在谷歌存储中的图像,其中包含保存在我的数据库中的 URL 或 PATH。
我在存储桶中创建了一个带有云功能的文件
bucket.upload(thumbPath, {
destination: join(bucketDir, thumbName),
});
然后我创建一个singnedUrl
const config = {
action: 'read',
expires: '03-01-2500',
};
const result = await thumbFile.getSignedUrl(config);
并将其保存在我的数据库中
我希望能够始终使用保存的 URL 加载图像。这工作大约一个星期。但后来我得到 403 错误。
我的存储规则是:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read: if true;
allow write: if request.auth != null;
}
}
}
是否有另一种不使用签名 URL 的方法,因为我认为这是错误的根源
解决方案
请注意,如果您的签名 URL 在大约 7 天后过期,可能是因为您使用的是V4 签名 API(或方法 getSignedUrl() 正在调用此 API)。从文档:
X-Goog-Expires:签名 URL 保持有效的时间长度,以 X-Goog-Date 中的值计算,以秒为单位。在此示例中,签名 URL 将在 15 分钟后过期。最长过期值为 604800 秒(7 天)。
另一方面,V2 签名(您可以查看此文档)对生成的签名 URL 的到期日期没有限制。
我不确定您使用哪个库来调用该getSignedUrl()
函数,但我怀疑它已更新并将签名方法从 V2 更改为 V4,现在生成的签名 URL 有 7 天的限制。如果您想继续使用它们,也许回滚到以前版本的库可能会有所帮助,或者您可以直接调用 V2 API 来生成 url。
无论如何,如果您想要另一种方法,可能最直接的方法就是将存储桶中的文件公开,请参阅此处的文档。您甚至可以公开整个存储桶,以便用户可以自由阅读其所有内容。
推荐阅读
- java - 如何将 Transaction State 转换为 ContractState 类型的 fooState?
- excel - 运行时错误 9 - 订阅超出范围
- php - 标头位置在服务器上不起作用,但在 localhost 上起作用
- c++ - 模板变量 C 数组完全专业化是否应该指定数组大小?
- javascript - mouseover 事件在点击 Google Chrome 之前不会触发
- aws-lambda - 从 Lambda 安全地查询 AWS RDS
- java - 忽略密码验证的基本身份验证
- r - 使用嵌套数据循环遍历行和列
- reactjs - React:如何将自定义属性添加到 html 元素
- react-native - 代码上的更改未反映在 React Native 中