我正在尝试构建一个 Restful API,供用户通过我的 API 从云存储下载 zip 文件。
这样做的原因:
- 防止直接访问我们的内部云存储
- 隐藏正在使用的技术(存储品牌等(
- 获得对用户请求的控制(日志记录、验证(
在我的APi上应该有两种方法可以做到这一点:
-
下载为 Byte[] 并返回
-
下载为临时文件并读取为 byte[] 并返回
public static byte[] GetReportFile(GetReportRequest request, string refId)
{
//C# byte limit is 2GB
byte[] file = null;
try
{
var report = ReportDao.GetReport(request.ReportId);
var tempFilePath = new StorageService().DownloadByUriToTempFile(report.CloudPath);
}
catch (Exception ex)
{
}
return file;
}
这两种方式都需要将文件下载到内存或临时文件中,等待文件传输完成(等待用户下载完成或仅传递到 HTTP???(,然后释放内存或删除临时文件。
如果文件的大小为 2 GB(假设这对于服务器来说很大(,有没有办法最大限度地减少服务器端的负载,可能是像下载卡盘一样,只保留一小部分内存正在使用。
提前谢谢。
杰米
是的,执行所需操作的一种更好方法是:
在- 存储帐户中以
private Blobs
方式托管文件 - 获取文件的 HTTP 请求时,请为 Blob 生成
SAS
令牌,并仅返回文件的SAS URL
作为响应。SAS 令牌的有效性可能因您的要求而异,但明智的做法是将其保持在最低限度。 - 因此,客户端本质上将获得一个公共URL,该URL在有限的时间内有效,以获取zip文件,而不会消耗服务的资源。