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
}
}
}
.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
を呼び出す代わりに使用できます。
さらに安価な方法は、S3のオブジェクトに事前署名付きURLを使用することです。これにより、期限切れのURLをリソースに返すことができ、ストリームのコピーを行う必要がありません。そのために必要なメモリは非常に少ないため、非常に小さく安価なVMを使用できます。
このアプローチは、少数のリソースと少数のクライアントでのみ機能します。リクエストが増えると、AWS APIの制限に達する可能性があります。