1.服务介绍
Simple Storage Service(S3)是一种对象存储服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档等。本文将介绍如何使用媒体存储工具将文件上传到S3中。
2.源代码准备
2.1.方式一
直接从 github 上 clone 源代码。
// Clone this repository with submodules
git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
2.2.方式二
(1)若网络情况不佳,直接下载压缩包 xxx.zip。
(2)打开解压后的目录,找到 .gitmodules 文件,查看子模块的 URL。
(3)对于每个子模块,分别下载其 ZIP 文件,并解压到相应的子目录下。
(4)确保子模块的位置与 .gitmodules 文件中定义的一致。
3.环境依赖
源代码的编译安装依赖于一些相关库,如 openssl 和 curl 等,在安装前需准备相关环境。
// (示例)编译安装openssl-1.1.1
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
mkdir build
cd build
../config zlib-dynamic shared
make
make install
// 若要覆盖系统中已安装的openssl则执行以下命令
// 更新系统链接
sudo ln -sf /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
sudo ln -sf /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
// 更新动态链接器缓存
sudo ldconfig
// (示例)编译安装curl-7.51.0
tar xzf curl-7.51.0.tar.gz
cd curl-7.51.0
mkdir build
cd build
mkdir install
../configure --prefix=$PWD/install --with-ssl --enable-static --disable-shared
make
make install
4.编译安装
相关环境依赖安装完成后,接下来即可进入源代码目录进行编译安装。
cd xxx
mkdir build
cd build
mkdir install
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$PWD/install -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DUSE_OPENSSL=ON
make
make install
5.操作示例
void testSaveS3() {
// 初始化 SDK
SDKOptions options;
// 设置日志记录器
options.loggingOptions.logLevel = Utils::Logging::LogLevel::Debug;
InitAPI(options);
String bucketName = "your-bucket-name";
std::string endPointTmp = "your-end-point";
size_t pos = endPointTmp.find("//");
if (pos != std::string::npos) {
endPointTmp = endPointTmp.substr(pos + 2);
}
String endpoint = endPointTmp;
String accessKeyId = "your-access-key";
String secretKey = "your-secret-key";
String fileName = "your-file-name";
String s3Key = "your-s3-key";
Client::ClientConfigurationInitValues values{true}; // 设置 shouldDisableIMDS=true 即禁用 IMDS 自动凭证检索
S3::S3ClientConfiguration clientConfig(values);
clientConfig.endpointOverride = endpoint;
clientConfig.scheme = Http::Scheme::HTTP;
clientConfig.verifySSL = false;
// 创建凭证
const Auth::AWSCredentials credentials(accessKeyId, secretKey);
// 创建S3客户端
S3::S3Client s3Client(credentials, nullptr, clientConfig);
S3::Model::PutObjectRequest request;
request.SetBucket(bucketName);
request.SetKey(s3Key); // 唯一性,否则s3上传的文件会被覆盖
std::shared_ptr<IOStream> inputData = MakeShared<FStream>("SampleAllocationTag", fileName.c_str(), std::ios_base::in | std::ios_base::binary);
if (!*inputData) {
ErrorL << "Unable to read file " << fileName;
ShutdownAPI(options);
return;
}
request.SetBody(inputData);
S3::Model::PutObjectOutcome outcome = s3Client.PutObject(request);
if (!outcome.IsSuccess()) {
ErrorL << "Error: putObject: " << outcome.GetError().GetMessage();
} else {
DebugL << "Added object '" << s3Key << "' to bucket '" << bucketName << "'.";
}
// 关闭 SDK
ShutdownAPI(options);
}