首页 > 解决方案 > 从 AWS S3 存储桶下载文件

问题描述

我正在尝试使用我在 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.

标签: c++amazon-web-servicesamazon-s3c++17libcurl

解决方案


            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 似乎也可以处理这个问题。

问候


推荐阅读