从AWS S3读取流涉及加载整个文件

时间:2016-09-14 17:53:20

标签: c# .net asp.net-mvc amazon-s3

我的方案的简短版本是我正在使用.NET SDK读取存储在Amazon S3中的文件...

GetObjectRequest request = new GetObjectRequest
{
    BucketName = this.m_bucketName,
    Key = GetFileKey(fileIdentifier),
};

IAmazonS3 source = ...
GetObjectResponse response = await source.GetObjectAsync(request);
return response.ResponseStream;

然后我将此流作为File结果

传递给MVC
public async Task<FileResult> Download(...)
{
   return File(GetAwsStream(...), ...);
}

问题是,显然S3在返回任何内容之前急切地计算整个文件的校验和。对于大文件,这是一个重要问题,因为

  • 在单个字节开始流式传输到客户端之前,Web服务器必须从AWS S3下载整个文件;对于大型文件,Web服务器响应客户端可能需要几分钟
  • 它在Web服务器上使用大量内存来读取整个流并计算校验和

这完全打败了流的重点。有没有办法得到一个真正的&#34;流&#34;来自S3?

1 个答案:

答案 0 :(得分:2)

您可以使用HTTP Range标头在循环中下载S3对象的特定字节,然后在下载后将这些字节传递给客户端。这样,Web服务器就不必等到检索完整个文件才能给客户端一些东西。