web-dev-qa-db-ja.com

AWS S3からオブジェクトをストリームとして取得する

AWS S3バケットから取得したオブジェクトのある種のストリーム(おそらくメモリストリーム?)を返すことが可能かどうかを確認しようとしています。

S3バケットには、さまざまな種類の画像、ドキュメントなどが多数含まれています。これらはすべて、私のWebサイトで使用する必要があります。ただし、AWS S3バケットへのパスを表示したくありません。
そのため、フルパスではなく、ストリームを作成し、画像とダウンロード可能なドキュメントをオンザフライで表示しようとしています。これは理にかなっていますか? :-)

C#/。NET AWS SDKを使用しています。

指摘されたアイデアや指示について聞くのを楽しみにしています!

public FileStream GetFile(string keyName)
{
    using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast2))
    {
        GetObjectRequest request = new GetObjectRequest
        {
            BucketName = bucketName,
            Key = keyName
        };

        using (GetObjectResponse response = client.GetObject(request))
        using (Stream responseStream = response.ResponseStream)
        using (StreamReader reader = new StreamReader(responseStream))
        {
            // The following outputs the content of my text file:
            Console.WriteLine(reader.ReadToEnd());
            // Do some magic to return content as a stream
        }
    }
}
10
jrn

.NET 4では、 Stream.CopyTo を使用して、ResponseStreamのコンテンツ(つまり Amazon.Runtime.Internal.Util.MD5Stream )をMemoryStreamにコピーできます。

_GetObjectResponse response = await client.GetObjectAsync(bucketName, keyName);
MemoryStream memoryStream = new MemoryStream();

using (Stream responseStream = response.ResponseStream)
{
    responseStream.CopyTo(memoryStream);
}

return memoryStream;
_

ここで、client.GetObjectAsync(bucketName, keyName)は、作成しているリクエストでGetObjectを呼び出す代わりに使用できます。

18
moondaisy

さらに安価な方法は、S3のオブジェクトに事前署名付きURLを使用することです。これにより、期限切れのURLをリソースに返すことができ、ストリームのコピーを行う必要がありません。そのために必要なメモリは非常に少ないため、非常に小さく安価なVMを使用できます。

このアプローチは、少数のリソースと少数のクライアントでのみ機能します。リクエストが増えると、AWS APIの制限に達する可能性があります。

1
Optional Option