c++ - 从 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>"XXXXXXXXXXXXX"</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::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 似乎也可以处理这个问题。
问候