首页 > 解决方案 > 通过 Restful API 从云端下载大文件的最佳实践

问题描述

我正在尝试为用户构建一个 Restful API,以通过我的 API 从云存储中下载 zip 文件。

这样做的原因:

  1. 防止直接访问我们的内部云存储
  2. 隐藏正在使用的技术(存储品牌等)
  3. 控制用户请求(记录、验证)

在我的 APi 上应该有两种方法可以做到这一点:

  1. 下载为 Byte[] 并返回

  2. 下载为临时文件并读取为 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(假设这对于服务器来说很大),是否有任何方法可以最大程度地减少服务器端的负载,可能是逐个下载,只保留一小部分内存是正在使用。

提前致谢。

杰米

标签: c#azurerestapicloud

解决方案


是的,做你需要的一种更好的方法是:

  1. 将文件托管在private Blobs存储帐户中
  2. 当您收到对该文件的 HTTP 请求时,SAS为 Blob 生成一个令牌并仅返回SAS URL该文件的作为响应。SAS 令牌的有效性可能因您的要求而异,但最好将其保持在最低限度。
  3. 因此,客户端实际上将获得一个公共 URL,该 URL 在有限的时间内有效,以获取 zip 文件,而不会花费您的服务资源。

推荐阅读