我正在使用Asp.Net Core 2 web api处理托管在Google云端存储中的文件。托管在那里的文件不公开,因此我无法使用该对象的MediaLink
属性。我尝试使用MemoryStream
创建下载端点,但是当有许多用户同时下载大文件时,我遇到了内存问题。
我的问题是:有没有办法创建一些链接一个文件或类似东西的一次性下载链接?
我也尝试实施this link中描述的内容,但我需要向用户提供持票人令牌。我无法做到。
任何提示?
答案 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;
}