【问题标题】:Downloading file from AWS S3 Bucket从 AWS S3 存储桶下载文件
【发布时间】:2021-07-01 07:14:20
【问题描述】:

我正在尝试使用我在 github 上找到的以下代码通过我的 AWS S3 存储桶下载文件:curl_bazek

我能够通过修复代码的一些问题来使其正常工作。硬编码 Access 和 Secret 密钥并将时间调整为 GMT。但我不知道如何下载文件。

这是我的输出,您可以看到 test.dll 位于此存储桶中:

AWSSecretKey=XXXXXXX
https://XXXXXX.s3.amazonaws.com
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>atmaple</Name><Prefix>

</Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>test.dll</Key>
<LastModified>2021-06-29T16:18:40.000Z</LastModified>
<ETag>&quot;XXXXXXXXXXXXX&quot;</ETag>
<Size>45634048</Size><Owner><ID>XXXXXXXXXXXXX</ID></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>

更改网址会导致错误。

std::string hostS3Bucket = bucketName + ".s3.amazonaws.com/test.dll";

更改 curl url 也会导致相同的效果。

curl_easy_setopt(curl, CURLOPT_URL, ("https://" + hostS3Bucket + "/test.dll").c_str());

错误:

The specified bucket is not valid.

【问题讨论】:

  • 您可能想使用:AWS SDK for C++
  • @JohnRotenstein 是的,该方法在 SDK for C++ 中更加简洁,感谢您的建议。我能够轻松解决我的问题。

标签: c++ amazon-web-services amazon-s3 c++17 libcurl


【解决方案1】:
            Aws::SDKOptions options;
            Aws::InitAPI(options);
            {
                const Aws::String bucket_name = "bucket";
                const Aws::String object_name = "test.dll";
                const Aws::String region = "us-east-1";

                Aws::Client::ClientConfiguration config;

                if (!region.empty())
                {
                    config.region = region;
                }

                Aws::Auth::AWSCredentials credentials;
                credentials.SetAWSAccessKeyId("accesskey");
                credentials.SetAWSSecretKey("secretkey");

                Aws::S3::S3Client s3_client(credentials, config);

                Aws::S3::Model::GetObjectRequest object_request;
                object_request.SetBucket(bucket_name);
                object_request.SetKey(object_name);

                Aws::S3::Model::GetObjectOutcome get_object_outcome = s3_client.GetObject(object_request);

                if (get_object_outcome.IsSuccess())
                {
                    auto& retrieved_file = get_object_outcome.GetResultWithOwnership().GetBody();
                    int size = get_object_outcome.GetResultWithOwnership().GetContentLength() + 1;
                }
            }
            Aws::ShutdownAPI(options);

这对我有用。我通过内存加载 .dll,因此我不需要处理实际写入磁盘的问题,但如果需要,SDK 似乎也可以处理这个问题。

问候

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2019-02-16
    • 2021-05-23
    • 1970-01-01
    • 2015-05-20
    • 2021-09-28
    相关资源
    最近更新 更多