【问题标题】:Is it possible to use a download URL from GCS in JavaScript?是否可以在 JavaScript 中使用来自 GCS 的下载 URL?
【发布时间】:2019-11-06 16:36:36
【问题描述】:

这个新问题只是因为我的旧问题已关闭。所以我什至无法回答。

Javascript fetch using a download URL from GCS

我很少遇到必须考虑 CORS 的情况,所以我忘了它。但这就是正在发生的事情。

  1. 我使用fileRef.getDownloadURL()获得了 GCS 上文件的下载 URL。

  2. 在 Chrome 选项卡中打开此 URL 时有效。

  3. 但是由于(坏)CORS,尝试使用 JavaScript fetch 失败。

  4. 原则上,这可以通过gsutil cors set ... 解决(参见上面的问题)。

  5. 但是,由于我使用的是测试环境(firebase servelocalhost),因此似乎无法在gsutil 接受的请求标头中为来源设置值。

因此,如果有人知道上述 5 的解决方案,我将不胜感激。 (当然,我可以使用解决方法,但我不希望这样做。)

顺便说一句,我尝试使用建议的代理服务器,但这里似乎被阻止了。


编辑:我还向 Google 提交了错误报告。但如果我错了就好了,而且这不是 Firebase 本地测试和 GCS 之间相互作用的错误。

【问题讨论】:

  • 远非专家,我对 CORS 有所了解。此类问题通常可以通过让您自己的服务器充当下载代理来解决。 CORS 仅在您尝试从客户端 JS 获取某些内容时发挥作用,但据我所知,您这里有一个后端在玩,应该能够下载文件没问题。
  • @ChrisG 是的,我可以在 Firebase 端使用 Node.js 将文件下载到服务器,然后将其发送到客户端。但我宁愿避免它。效率低下。更多的工作。更多错误...
  • 因此,您想要实现一个假设的、可能很复杂的解决方案,而不是实现一个相对简单、众所周知的解决方案?据我所知,gsutil 路由仅适用于实际主机,不适用于您的 localhost 测试环境。顺便说一句,这些文件首先是什么?为什么需要获取它们?
  • @ChrisG 因为我尝试的代理服务器不起作用(请参阅我对已接受答案的评论)。是的,我需要获取文件,因为它们将在 PWA 中本地使用。

标签: javascript firebase cors google-cloud-storage fetch-api


【解决方案1】:

您的问题是:如何从客户端使用 Javascript 脚本从 GCS 获取内容。

这个问题是重复的,因为已经回答了here。请花点时间实际阅读答案,您会看到与您面临的相同问题。您可以使用替代方案,而无需修改存储桶的 cors 策略或从服务器端获取:

  1. 使用 Heroku 代理服务器(我已经使用 online demo 尝试过这个,它对我有用)

注释:

  • 此解决方案的实现显示在我在开头提到的问题及其解释中。
  • 确保您尝试访问的对象是公开的。
  • 您也可以使用“{ mode: 'no-cors'}”,它会检索内容,但您将无法通过客户端脚本访问它,因为响应将是“不透明的”。

【讨论】:

  • 对我来说,依赖可能在未来任何时候停止工作的第三方服务听起来不是一个合适的解决方案。这充其量是一个kludge。另外,如果一个问题是重复的,请标记它而不是回答它。
  • Leo,我不能说,我没有看他们的内部代码。 @Chris,在我提供的链接上,回答的人还提供了启动您自己的 Heroku 代理服务器的简单步骤,因此您不必依赖代理服务器。你是对的,这个问题应该被标记为重复,但它已经是并且它导致 OP 创建一个新问题(因为他们没有解释为什么它被认为是重复的)因此,我发布的原因。但我会编辑我的答案以将其标记为 CW,因为我之前忘记这样做了。
  • @Leo 是的,我的错;我的领域是建设性地解决问题,而这显然超出了这一点。我不会再打扰你了。
  • @Leo 没问题;不过,这不会改变我对您的问题的回答。 This page 列出了客户端库,并强烈支持我的建议,即您只应按预期从 GCS 下载某些内容,即从您的 服务器 下载,在这种情况下,CORS 不是问题。您想要对客户端下载进行身份验证这一事实意味着访问您网站的任何人都可以获取您应该使用的私人凭据。 Google 只是希望您像往常一样通过您的服务器路由下载。
  • @Leo 对不起,我已经用尽了所有可以告诉你你错了的方法,但没有直截了当地这么说。您链接到的文档是 Android API 文档的一部分,即 not 客户端 JS。坦率地说,我不在乎你认为谷歌是错的。他们不是。设置 ACAO 标头并将令牌放入 URL 中正是使 anybody 与 URL 下载文件的原因,这正是 Google 想要通过首先使用访问令牌来防止的事情。想想你浪费了多少时间试图通过这堵墙猛击你的头。什么时候就够了?
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2017-08-23
  • 2020-12-22
  • 2018-04-01
相关资源
最近更新 更多