当前位置: 首页 > 知识库问答 >
问题:

从AWS S3获取对象作为流

夹谷硕
2023-03-14

我试图弄清楚是否有可能返回某种流(可能是内存流?)我从我的桶里得到的东西。

S3 bucket包含很多不同类型的图像、文档等。所有这些都应该在我的网站上使用。但是,我不想显示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个答案

岳昊空
2023-03-14

更便宜的方法是在S3中使用预先签名的URL指向对象。这样,您就可以将过期的URL返回到您的资源中,而不需要进行任何流复制。这需要非常低的内存,因此您可以使用非常小且便宜的虚拟机。

这种方法只适用于少数资源和少数客户。随着请求的增加,您可能会达到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.
}
简学文
2023-03-14

在。NET 4,您可以使用Stream。CopyTo复制响应流的内容(即Amazon.运行时。内部。Util.MD5Stream)到MemoryStream。

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

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

return memoryStream;

其中客户端。GetObjectAsync(bucketName,keyName)是在创建请求时调用GetObject的替代方法。

 类似资料:
  • 我正在使用Spring Web创建一个rest资源。我用Java创建了类似于Json响应的文档对象。当我使用String.class作为响应类型时,我从请求中获取响应。当我更改对我创建的类的响应时,boy是null。 这是我的httpgetter Json文档 函数调用 JSON响应

  • 问题内容: 是否可以从中获取Path对象? 我知道您可以使用方法将路径转换为文件,但找不到相反的转换。在Java 6或更低版本中有没有办法做到这一点? 问题答案: 是的,您可以使用从对象获取它。请记住,这仅适用于Java 7+。Java 6及以下版本没有它。

  • 问题内容: 我有一个网址,返回的是这样的JSON对象: 我想获得价值。那么如何通过PHP检索它呢? 问题答案: $json = file_get_contents(‘url_here’); $obj = json_decode($json); echo $obj->access_token; 为此,需要启用它。可以通过在运行时完成以下操作来实现: 您也可以使用获取网址。要使用卷曲,可以使用中发现的

  • 我有一个名为AnimalsData的文件,它有一个由数组组成的对象。数组由一个对象和另一个数组组成。它看起来像这样: 我的HTML文件如下所示: 我正试图获取的值的类名对象从动画类数组。我一直在使用以下两个stackoverflow页面作为指南: 访问JSON数组中的对象和访问/处理(嵌套)对象、数组或JSON 我有另一个javascript文件,其中包含以下内容: 编辑我将for in循环中的"

  • 我有一个返回JSON对象的URL,如下所示: 我想从URL获取JSON对象,然后获取值。 那么如何通过PHP检索它呢?

  • 我正在尝试编写一个可以搜索对象[]数组的SpEL表达式。下面是一些示例代码: 有谁能帮我写一个SpEL来搜索arr并找到第一个具有属性“bar”的对象并返回bar的值吗? 它的实际应用是,我正在为一个方面编写注释,并试图在注释中声明参数的路径: 非常感谢你的帮助!