c# - 通过 Restful API 从云端下载大文件的最佳实践
问题描述
我正在尝试为用户构建一个 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 请求时,
SAS
为 Blob 生成一个令牌并仅返回SAS URL
该文件的作为响应。SAS 令牌的有效性可能因您的要求而异,但最好将其保持在最低限度。 - 因此,客户端实际上将获得一个公共 URL,该 URL 在有限的时间内有效,以获取 zip 文件,而不会花费您的服务资源。
推荐阅读
- powerbi - 如何按每个月按状态计算客户数量,以了解每个月有多少客户活跃或入职
- docker - Docker Kubernetes (Mac) - Autoscaler 无法找到指标
- intellij-idea - IntelliJ IDEA 快速文档不显示带有自定义标签的 javadoc
- amazon-web-services - 如何在不公开文件的情况下将文件从一个 S3 存储桶访问到另一个存储桶?
- mysql - 在不使用 IN 语句的情况下重新设计查询
- r - 仅将 geom 默认美学更改为主题组件的一部分
- ruby-on-rails - Rails 5 嵌套路由
- artificial-intelligence - MonteCarloTreeSearch 是否适合这种问题规模(大动作/状态空间)?
- java - 如何使用 akka 流在图中限制请求?
- android - 如何在 Cordova android 应用程序的根目录而不是应用程序数据目录中写入文件?