デフォルトでは、必要なアクセス権限があれば、新しいオブジェクトは同じ名前の既存のオブジェクトを上書きします。このトピックでは、シンプルアップロード、オブジェクトのコピー、およびマルチパートアップロードで x-oss-forbid-overwrite リクエストヘッダーを設定して、この動作を防止する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して `OSSClient` インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して `OSSClient` を作成する場合は、「OssClient インスタンスの作成」をご参照ください。
シンプルアップロード
シンプルアップロード中に同名のオブジェクトが上書きされるのを防ぐ方法を次のコードに示します。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが配置されているリージョンに設定します。中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
std::string ObjectName = "exampledir/exampleobject.txt";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
ObjectMetaData meta;
meta.addHeader("x-oss-forbid-overwrite", "true");
PutObjectRequest request(BucketName, ObjectName, content, meta);
/* ファイルをアップロードします。*/
auto outcome = client.PutObject(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "PutObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}ファイルのコピー
小容量ファイルのコピー
小容量ファイルをコピーする際に、同名のファイルの上書きを防ぐ方法を次のコードに示します。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが配置されているリージョンに設定します。中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* コピー元バケット名を指定します。例:srcexamplebucket */
std::string SourceBucketName = "srcexamplebucket";
/* コピー元バケットと同じリージョンにあるコピー先バケットの名前を指定します。例:destbucket */
std::string CopyBucketName = "destbucket";
/* コピー元オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:srcdir/scrobject.txt */
std::string SourceObjectName = "srcdir/scrobject.txt";
/* コピー先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:destdir/destobject.txt */
std::string CopyObjectName = "destdir/destobject.txt";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
ObjectMetaData meta;
meta.addHeader("x-oss-forbid-overwrite", "true");
CopyObjectRequest request(CopyBucketName, CopyObjectName, meta);
request.setCopySource(SourceBucketName, SourceObjectName);
/* ファイルをコピーします。*/
auto outcome = client.CopyObject(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "CopyObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}大容量ファイルのコピー
大容量ファイルをコピーする際に、同名のファイルの上書きを防ぐ方法を次のコードに示します。
#include <alibabacloud/oss/OssClient.h>
#include <sstream>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが配置されているリージョンに設定します。中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* コピー元バケット名を指定します。例:srcexamplebucket */
std::string SourceBucketName = "srcexamplebucket";
/* コピー元バケットと同じリージョンにあるコピー先バケットの名前を指定します。例:destbucket */
std::string CopyBucketName = "destbucket";
/* コピー元オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:srcdir/scrobject.txt */
std::string SourceObjectName = "srcdir/scrobject.txt";
/* コピー先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:destdir/destobject.txt */
std::string CopyObjectName = "destdir/destobject.txt";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
auto getObjectMetaReq = GetObjectMetaRequest(SourceBucketName, SourceObjectName);
auto getObjectMetaResult = GetObjectMeta(getObjectMetaReq);
if (!getObjectMetaResult.isSuccess()) {
std::cout << "GetObjectMeta fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* コピーするファイルのサイズを取得します。*/
auto objectSize = getObjectMetaResult.result().ContentLength();
/* 大容量ファイルをコピーします。*/
ObjectMetaData metaData;
std::stringstream ssDesc;
ssDesc << "/" << SourceBucketName << "/" << SourceObjectName;
std::string value = ssDesc.str();
metaData.addHeader("x-oss-copy-source", value);
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
metaData.addHeader("x-oss-forbid-overwrite", "true");
InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName, metaData);
/* マルチパートコピーイベントを初期化します。*/
auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest);
auto uploadId = uploadIdResult.result().UploadId();
int64_t partSize = 100 * 1024;
PartList partETagList;
int partCount = static_cast<int>(objectSize / partSize);
/* パート数を計算します。*/
if (objectSize % partSize != 0) {
partCount++;
}
/* 各パートをコピーします。*/
for (int i = 1; i <= partCount; i++) {
auto skipBytes = partSize * (i - 1);
auto size = (partSize < objectSize - skipBytes) ? partSize : (objectSize - skipBytes);
auto uploadPartCopyReq = UploadPartCopyRequest(CopyBucketName, CopyObjectName, SourceBucketName, SourceObjectName,uploadId, i + 1);
uploadPartCopyReq.setCopySourceRange(skipBytes, skipBytes + size -1);
auto uploadPartOutcome = client.UploadPartCopy(uploadPartCopyReq);
if (uploadPartOutcome.isSuccess()) {
Part part(i, uploadPartOutcome.result().ETag());
partETagList.push_back(part);
}
else {
std::cout << "UploadPartCopy fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
}
}
/* マルチパートコピーを完了します。*/
CompleteMultipartUploadRequest request(CopyBucketName, CopyObjectName, partETagList, uploadId);
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
request.MetaData().addHeader("x-oss-forbid-overwrite", "true");
auto outcome = client.CompleteMultipartUpload(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "CompleteMultipartUpload fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}マルチパートアップロード
マルチパートアップロード中に同名のオブジェクトが上書きされるのを防ぐ方法を次のコードに示します。
#include <alibabacloud/oss/OssClient.h>
#include <fstream>
int64_t getFileSize(const std::string& file)
{
std::fstream f(file, std::ios::in | std::ios::binary);
f.seekg(0, f.end);
int64_t size = f.tellg();
f.close();
return size;
}
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
std::string ObjectName = "exampledir/exampleobject.txt";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
ObjectMetaData meta;
meta.addHeader("x-oss-forbid-overwrite", "true");
InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName, meta);
/* マルチパートアップロードイベントを初期化します。*/
auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest);
auto uploadId = uploadIdResult.result().UploadId();
std::string fileToUpload = "yourLocalFilename";
int64_t partSize = 100 * 1024;
PartList partETagList;
auto fileSize = getFileSize(fileToUpload);
int partCount = static_cast<int>(fileSize / partSize);
/* パート数を計算します。*/
if (fileSize % partSize != 0) {
partCount++;
}
/* 各パートをアップロードします。*/
for (int i = 1; i <= partCount; i++) {
auto skipBytes = partSize * (i - 1);
auto size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary);
content->seekg(skipBytes, std::ios::beg);
UploadPartRequest uploadPartRequest(BucketName, ObjectName, content);
uploadPartRequest.setContentLength(size);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(i);
auto uploadPartOutcome = client.UploadPart(uploadPartRequest);
if (uploadPartOutcome.isSuccess()) {
Part part(i, uploadPartOutcome.result().ETag());
partETagList.push_back(part);
}
else {
std::cout << "uploadPart fail" <<
",code:" << uploadPartOutcome.error().Code() <<
",message:" << uploadPartOutcome.error().Message() <<
",requestId:" << uploadPartOutcome.error().RequestId() << std::endl;
}
}
/* マルチパートアップロードを完了します。*/
CompleteMultipartUploadRequest request(BucketName, ObjectName);
request.setUploadId(uploadId);
request.setPartList(partETagList);
/* アップロード中に同名のオブジェクトを上書きするかどうかを指定します。*/
/* x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。*/
/* x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。*/
request.MetaData().addHeader("x-oss-forbid-overwrite", "true");
auto outcome = client.CompleteMultipartUpload(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "CompleteMultipartUpload fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}関連ドキュメント
シンプルアップロードの API 操作の詳細については、「PutObject」をご参照ください。
ファイルのコピーの API 操作の詳細については、「CopyObject」をご参照ください。
マルチパートアップロードの API 操作の詳細については、「InitiateMultipartUpload」および「CompleteMultipartUpload」をご参照ください。