2016-09-14 179 views
1

我的情况的短版是我读出存储在Amazon的S3与.NET SDK文件...从AWS S3读取流涉及加载整个文件

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

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

我再通过通过这个流以MVC为File结果

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

问题是,显然S3被返回任何东西之前,急切地计算整个文件的校验和。对于大文件,这是因为

  • Web服务器必须下载从AWS S3整个文件的单个字节之前可以开始流传输到客户端显著的问题;对于大文件之前,Web服务器响应客户端可能需要几分钟
  • 它使用一吨的存储在Web服务器上读取整个流,并计算校验

这完全违背了点流。有没有办法从S3获得实际的“流”?

+0

我遇到同样的问题。我可以在流上调用'.ToArray()'来获取内容,但我似乎无法使用'return File(stream,contentType,fileName);'因为下载时文件中没有包含任何内容。 – Jecoms

回答

2

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