【问题标题】:Reading text file contents from an S3 bucket using an S3 URL使用 S3 URL 从 S3 存储桶读取文本文件内容
【发布时间】:2019-09-19 11:58:06
【问题描述】:

我需要读取上传到 AWS S3 存储桶中的文本文件的内容。我有位于 S3 存储桶中的文件的 URL。有人可以帮我阅读使用 S3 URL 的文本文件内容。

我知道我们可以使用 ResponseStream 读取数据,但想使用 URL/路径读取它。我需要使用 .NET Core 创建 AWS Lambda 服务。下面的代码突出显示了如何使用 ResponseStream 读取它

using (GetObjectResponse response = await _client.GetObjectAsync(requestGet))
using (Stream responseStream = response.ResponseStream)
using (StreamReader reader = new StreamReader(responseStream))

【问题讨论】:

  • 为什么不使用AWS SDK来获取对象呢?

标签: amazon-web-services amazon-s3 .net-core aws-lambda


【解决方案1】:

AWS .Net SDK 是您问题的答案:

-通过在请求中提供桶名和对象键来执行getObject方法。

-执行 GetObjectResponse 方法之一来处理流。

以下是来自 AWS link 的相同示例:

using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class GetObjectTest
    {
        private const string bucketName = "*** bucket name ***";
        private const string keyName = "*** object key ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            ReadObjectDataAsync().Wait();
        }

        static async Task ReadObjectDataAsync()
        {
            string responseBody = "";
            try
            {
                GetObjectRequest request = new GetObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName
                };
                using (GetObjectResponse response = await client.GetObjectAsync(request))
                using (Stream responseStream = response.ResponseStream)
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    string title = response.Metadata["x-amz-meta-title"]; // Assume you have "title" as medata added to the object.
                    string contentType = response.Headers["Content-Type"];
                    Console.WriteLine("Object metadata, Title: {0}", title);
                    Console.WriteLine("Content type: {0}", contentType);

                    responseBody = reader.ReadToEnd(); // Now you process the response body.
                }
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}

【讨论】:

  • 这段代码也使用 responseStream 来读取桶。我知道这种方法我想通过传递 S3 存储桶文件的 url 来读取 S3 存储桶中的文件。我们通过在 Filestream 对象中传递 Url 来读取文件的方式。寻找方法是否可以在 StreamReader 中传递 S3 存储桶的路径。
  • 我不确定,但您认为您将无法将 S3 字符串作为源传递给 streamreader 并直接读取文件。原因是 S3 需要很多其他参数才能通过流读取器打开文件。我知道您可以点击链接并在浏览器中打开带有文本的文件 - 可能您可以实现一种通过该方法读取它并在代码中转换浏览器调用然后使用 streamreader 的方法。但它看起来像太多的并发症。顺便说一句,为什么您需要直接在 reader 中传递?有什么具体原因吗?
  • 我需要某种方法来使用路径或 URL 读取文件,因为需要将现有代码转换为 Lambda,并且在该代码中,他们使用一个从文件位置读取而不是从流中读取的解析器,所以我需要通过提供 S3 文件的路径可以读取文件的某种方式
  • 我相信您会尝试过 - 使用 lambdawiths3 角色和复制事件 .. 这将获取存储桶的 s3 位置,您可以定义所需的文件。
猜你喜欢
  • 2016-07-12
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2019-08-21
  • 2020-12-16
相关资源
最近更新 更多