2017-10-05 15 views
1

AWSSDK.S3ナゲットパッケージを使用して、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"); 
} 

をストリームを渡します。それから、レスポンスストリームを渡すだけで、Fileの結果はそれを読んで応答を返します。

+0

これは、「このように動作することは非常に簡単です」という状況のようです。私はAWSの世界には新しいので、中間ストリームを使用する理由についてはわかりませんでした。私はこれを行って、明日この問題を再訪します、ありがとう! – Jecoms

+0

HttpResponseオブジェクトを使用するコントローラコードのように見えました。 – Jecoms

+0

@Jecoms、私は訂正します。それはおそらく以前のバージョンのものでした。 – Nkosi

関連する問題