【问题标题】:How to return a FileResult using an Amazon S3 ResponseStream?如何使用 Amazon S3 ResponseStream 返回 FileResult?
【发布时间】:2018-03-17 15:20:40
【问题描述】:

使用 AWSSDK.S3 nuget 包,我正在尝试返回已从 S3 存储桶中检索到的文件。我的出发点是基于SO answer 中给出的示例。

示例控制器代码:

public FileResult GetFile(Guid id)
{
    // no using block as it will be disposed of by the File method
    var amazonResponse = _foo.GetAmazonResponseWrapper(_user, id);
    // set Response content-length header
    // set Response content-type header

    var bufferSize = 1024;
    var buffer = new byte[bufferSize];
    int bytesRead;

    while ((bytesRead = amazonResponse.ResponseStream.Read(buffer, 0, buffer.Length)) > 0 && Response.IsClientConnected)
    {
        Response.OutputStream.Write(buffer, 0, bytesRead);
        Response.OutputStream.Flush();
        buffer = new byte[bufferSize];
    }        

    // this will not work (can't read from this stream)
    return File(Response.OutputStream, "text/plain", "bar.txt");
}

如果我写一个MemoryStream 我在while 循环中创建和使用,我会得到一个文件,但不会有任何内容。

我发现在文件中获取内容的唯一方法是像这样在流上调用.ToArray()

return File(memStream.ToArray(), "text/plain", "foo.txt");

有没有办法将文件实际流式传输到浏览器而不将其加载到 Web 服务器的内存中?

【问题讨论】:

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


    【解决方案1】:

    只需将流向前传递

    public FileResult GetFile(Guid id) {
        // no using block as it will be disposed of by the File method
        var amazonResponse = _foo.GetAmazonResponseWrapper(_user, id);
        return File(amazonResponse.ResponseStream, "text/plain", "bar.txt");
    }
    

    您已经证明可以从响应流中读取数据。然后只需传递响应流,文件结果就会读取它并返回响应。

    【讨论】:

    • 这似乎是“它显然很简单,它必须以这种方式工作”的情况之一。我不确定使用中间流的原因,因为我是 AWS 世界的新手。我会试一试,明天重新审视这个问题,谢谢!
    • 当然。它似乎只是使用 HttpResponse 对象的控制器代码。
    • @Jecoms,我的立场是正确的。它可能是针对早期版本的。
    • 看起来工作正常;它很简单并且(应该)直观。我唯一不清楚的是它如何处理内容长度。现在,我使用Response.AddHeader()为其添加了一个标题,但我不确定是否有必要。 (S3 SDK 返回的GetObjectResponse 对象有这个信息。)
    • @Jecoms 动作结果的内部工作原理将从流的长度中获取内容长度
    猜你喜欢
    • 2019-09-29
    • 2018-03-25
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2012-09-14
    相关资源
    最近更新 更多