Google云端存储获取下载链接

时间:2018-04-25 18:01:18

标签: google-cloud-storage

我正在使用Asp.Net Core 2 web api处理托管在Google云端存储中的文件。托管在那里的文件不公开,因此我无法使用该对象的MediaLink属性。我尝试使用MemoryStream创建下载端点,但是当有许多用户同时下载大文件时,我遇到了内存问题。

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

我也尝试实施this link中描述的内容,但我需要向用户提供持票人令牌。我无法做到。

任何提示?

2 个答案:

答案 0 :(得分:5)

是。 Google云端存储提供了一种称为“已签名网址”的功能,这就是您所描述的功能:只需短时间下载单个文件的网址即可。我们的想法是您制作下载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

答案 1 :(得分:0)

我设法使用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 - 获取网址的方法:

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