C# 从AWS S3读取流涉及加载整个文件
我的场景的简短版本是,我正在使用.NETSDK读取存储在Amazon的S3中的文件C# 从AWS S3读取流涉及加载整个文件,c#,.net,asp.net-mvc,amazon-s3,C#,.net,Asp.net Mvc,Amazon S3,我的场景的简短版本是,我正在使用.NETSDK读取存储在Amazon的S3中的文件 GetObjectRequest request = new GetObjectRequest { BucketName = this.m_bucketName, Key = GetFileKey(fileIdentifier), }; IAmazonS3 source = ... GetObjectResponse response = await source.GetObjectAsync(
GetObjectRequest request = new GetObjectRequest
{
BucketName = this.m_bucketName,
Key = GetFileKey(fileIdentifier),
};
IAmazonS3 source = ...
GetObjectResponse response = await source.GetObjectAsync(request);
return response.ResponseStream;
然后,我将此流作为文件
结果传递给MVC
public async Task<FileResult> Download(...)
{
return File(GetAwsStream(...), ...);
}
公共异步任务下载(…)
{
返回文件(GetAwsStream(…),…);
}
问题是,显然,S3在返回任何内容之前急切地计算整个文件的校验和。对于大型文件,这是一个重要的问题,因为
- web服务器必须从AWS S3下载整个文件,然后单个字节才能开始流式传输到客户端;对于大型文件,web服务器响应客户端可能需要几分钟的时间
- 它使用web服务器上的大量内存来读取整个流并计算校验和
这完全违背了溪流的观点。有没有办法从S3获取实际的“流”?您可以使用头在循环中下载S3对象的特定字节,然后在下载后将这些字节传递给客户端。这样,web服务器就不必等到检索到完整的文件后才给客户端提供一些信息。我也遇到了同样的问题。我可以在流上调用
.ToArray()
来获取内容,但我似乎不能仅仅使用返回文件(流、contentType、文件名)代码>因为下载时文件不包含任何内容。