2017-10-05 105 views
1

使用AWSSDK.S3 nuget包,我試圖返回從S3存儲桶檢索到的文件。我的出發點是基於此SO answer中給出的示例。如何使用Amazon S3 ResponseStream返回FileResult?

例控制器代碼:

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服務器的內存?

回答

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"); 
} 

您已經表明,你可以從響應流中讀取的數據流。然後只傳遞響應流,文件結果將讀取它並返回響應。

+0

這看起來像是其中一個「它非常簡單,它必須以這種方式工作」的情況。我不確定使用中間流的原因,因爲我是AWS新手。我明天再說一遍這個問題,謝謝! – Jecoms

+0

當然。它似乎是使用HttpResponse對象的控制器代碼。 – Jecoms

+0

@Jecoms,我糾正了。這可能是早期版本。 – Nkosi