【问题标题】:Google Cloud Storage getting download link谷歌云存储获取下载链接
【发布时间】:2018-05-14 22:33:32
【问题描述】:

我正在使用 Asp.Net Core 2 web api 来处理托管在 Google Cloud Storage 上的文件。那里托管的文件不是公开的,所以我不能使用对象的MediaLink 属性。我尝试使用MemoryStream 创建一个下载端点,但是当有很多用户同时下载大文件时,我遇到了内存问题。

我的问题是:有没有办法为文件或类似的东西创建链接、一次性下载链接?

我也在尝试实现this link 中描述的内容,但我需要将不记名令牌提供给用户。我做不到。

有什么建议吗?

【问题讨论】:

    标签: google-cloud-storage


    【解决方案1】:

    是的。 Google Cloud Storage 提供了一项称为“签名 URL”的功能,正如您所描述的:一个仅在短时间内下载单个文件的 URL。这个想法是您制作一个下载 URL,然后使用服务帐户的私钥来“签名”该 URL。持有该最终 URL 的任何人都可以使用它作为该服务帐户来下载该对象。

    看一看:https://cloud.google.com/storage/docs/access-control/#Signed-URLs

    编写代码来生成签名 URL 有点棘手,但客户端库提供了多种语言的辅助方法来为您完成。您也可以使用 gsutil 命令生成一个:gsutil signurl -d 10m privatekey.p12 gs://bucket/foo

    在他们的 GitHub 项目中有一个代码示例,用于以编程方式生成他签名的 URL:Signed URLs

    【讨论】:

      【解决方案2】:

      我设法使用 C# 创建它。我在这里发帖是因为这对其他人有用:

      1 - Create your private key 2 - 创建和 UrlSigner:

      private readonly UrlSigner _urlSigner;
      

      2 - 在你的类构造函数中:

          using (var stream = File.OpenRead(_googleSettings.StorageAuthJson))
          {
              _urlSigner = UrlSigner.FromServiceAccountData(stream);
          }
      

      _googleSettings.StorageAuthJson 有你创建密钥时下载的 json 文件的物理路径。

      3 - 获取 URL 的方法:

      public string GetSignedUrl(string bucketName, string objectName, TimeSpan duration) {
          var url = _urlSigner.Sign(bucketName, objectName, duration, null);
          return url;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 2013-03-17
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多