从AWS S3获取对象作为流

时间:2017-02-09 19:55:39

标签: c# amazon-web-services amazon-s3

我试图弄清楚是否可能返回我从AWS S3存储桶获取的某种对象的某种流(可能是内存流?)。

S3存储桶包含许多不同类型的图像,文档等。所有这些都应该在我的网站上使用。但是,我不想显示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
        }
    }
}

2 个答案:

答案 0 :(得分:6)

在.NET 4中,您可以使用Stream.CopyTo将ResponseStream的内容(即Amazon.Runtime.Internal.Util.MD5Stream)复制到MemoryStream。

GetObjectResponse getObjRespone = client.GetObject(Bucket, objectName);
MemoryStream stream = new MemoryStream();
getObjRespone.ResponseStream.CopyTo(stream);
return stream;

其中client.GetObject(Bucket, objectName)是使用您正在创建的请求调用GetObject的替代方法。

答案 1 :(得分:0)

更便宜的方法是对S3中的对象使用预签名的URL。这样,您可以将过期的URL返回到您的资源,而无需执行任何流复制。为此,需要非常低的内存,因此您可以使用非常小且便宜的VM。

此方法仅适用于少量资源和少量客户端。对于更多请求,您可能会达到AWS API限制。