繁体   English   中英

从 AWS S3 获取对象作为流

[英]Get object from AWS S3 as a stream

我试图弄清楚是否有可能返回我从 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
        }
    }
}

在 .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 限制。

using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast2))
{
    var request = new GetPreSignedUrlRequest()
    {
        BucketName = bucketName,
        Key = keyName,
        Expires = DateTime.UtcNow.AddMinutes(10),
        Verb = HttpVerb.GET, 
        Protocol = Protocol.HTTPS
    };
    var url = client.GetPreSignedURL(request);
    // ... and return url from here. 
    // Url is valid only for 10 minutes
    // it can be used only to GET content over HTTPS
    // Any other operation like POST would fail.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM