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

4

我的情况简述如下:我正在使用.NET SDK读取存储在亚马逊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在返回任何东西之前急切地计算整个文件的校验和。对于大文件来说,这是一个重大问题,因为:
- 网页服务器必须从AWS S3下载整个文件,然后才能开始将单个字节流式传输到客户端;对于大文件,网页服务器要花费数分钟才能响应客户端。 - 它在网页服务器上使用了大量内存来读取整个流并计算校验和。
这完全打败了使用流的意义。是否有任何方法可以从S3获取实际的“流”?

1
我遇到了相同的问题。在流上调用 .ToArray() 可以获取内容,但是当下载文件时似乎无法仅使用 return File(stream, contentType, fileName);,因为文件是空的。 - Jecoms
1个回答

3
您可以使用HTTP Range头,在循环中下载S3对象的特定字节,然后在下载完成后将这些字节传递给客户端。这样,Web服务器就不必等待完整文件被检索以向客户端提供内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接