デフォルトでは、必要なアクセス権限があれば、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトは上書きされます。このトピックでは、シンプルなアップロード、オブジェクトのコピー、マルチパートアップロードなどのシナリオで、`x-oss-forbid-overwrite` リクエストヘッダーを設定してオブジェクトが上書きされるのを防ぐ方法について説明します。
注意事項
このトピックのサンプルコードを使用する前に、カスタムドメイン名、Security Token Service (STS)、またはその他の方法を使用して OSSClient インスタンスを作成する必要があります。詳細については、「初期化 (iOS SDK)」をご参照ください。
シンプルなアップロード
次のコードは、シンプルなアップロード中に同名のオブジェクトが上書きされるのを防ぐ方法を示しています。
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// バケット名を指定します。例:examplebucket。バケットの命名規則の詳細については、「バケットの命名規則」をご参照ください。
put.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。バケット名は含めないでください。例:exampledir/exampleobject.txt。オブジェクトの命名規則の詳細については、「オブジェクトの命名規則」をご参照ください。
put.objectKey = @"exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。
put.uploadingFileURL = [NSURL fileURLWithPath:@"/storage/emulated/0/oss/examplefile.txt"];
// 同名の既存オブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名の既存オブジェクトは上書きされません。同名のオブジェクトが既に存在する場合、プログラムはエラーを報告します。
put.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};
// オプション。アップロードの進捗状況を設定します。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
// 現在の送信バイト数、送信済み合計バイト数、送信予定合計バイト数。
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"upload object success!");
} else {
NSLog(@"upload object failed, error: %@" , task.error);
}
return nil;
}];
// 現在のスレッドをブロックして、タスクが完了するのを待ちます。
// [putTask waitUntilFinished];ファイルのコピー
次のコードは、オブジェクトをコピーする際に既存のオブジェクトが上書きされるのを防ぐ方法を示しています。
OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// ソースバケット名を指定します。
copy.sourceBucketName = @"srcbucket";
// ソースオブジェクトの完全なパスを指定します。
copy.sourceObjectKey = @"dir1/srcobject.txt";
// 宛先バケット名を指定します。
copy.bucketName = @"destbucket";
// 宛先オブジェクトの完全なパスを指定します。
copy.objectKey = @"dir2/destobject.txt";
// 同名の既存オブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名の既存オブジェクトは上書きされません。同名のオブジェクトが既に存在する場合、プログラムはエラーを報告します。
copy.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};
OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"copy object success!");
} else {
NSLog(@"copy object failed, error: %@" , task.error);
}
return nil;
}];
// 現在のスレッドをブロックして、タスクが完了するのを待ちます。
// [putTask waitUntilFinished];マルチパートアップロード
次のコードは、マルチパートアップロード中に同名のオブジェクトが上書きされるのを防ぐ方法を示しています。
__block NSString * uploadId = nil;
__block NSMutableArray * partInfos = [NSMutableArray new];
// バケット名を指定します。例:examplebucket。
NSString * uploadToBucket = @"examplebucket";
// オブジェクトの完全なパスを指定します。バケット名は含めないでください。例:exampledir/exampleobject.txt。
NSString * uploadObjectkey = @"exampledir/exampleobject.txt";
OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
init.bucketName = uploadToBucket;
init.objectKey = uploadObjectkey;
// 同名の既存オブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名の既存オブジェクトは上書きされません。同名のオブジェクトが既に存在する場合、プログラムはエラーを報告します。
init.objectMeta = @{@"x-oss-forbid-overwrite": @"true"};
// multipartUploadInit への応答にはアップロード ID が含まれます。アップロード ID は、マルチパートアップロードタスクを一意に識別します。このアップロード ID を使用して、マルチパートアップロードタスクのキャンセルやクエリなどの操作を実行できます。
OSSTask * initTask = [client multipartUploadInit:init];
[initTask waitUntilFinished];
if (!initTask.error) {
OSSInitMultipartUploadResult * result = initTask.result;
uploadId = result.uploadId;
} else {
NSLog(@"multipart upload failed, error: %@", initTask.error);
return;
}
// アップロードするローカルファイルの完全なパスを指定します。
NSString * filePath = @"/storage/emulated/0/oss/examplefile.txt";
// アップロードするファイルのサイズを取得します。
uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];
// パート番号を設定します。パート番号は 1 から始まります。アップロードされる各パートには、1 から 10,000 までのパート番号があります。
int chuckCount = *;
// パートサイズをバイト単位で設定します。パートサイズは 100 KB から 5 GB の範囲で指定できます。
uint64_t offset = fileSize/chuckCount;
for (int i = 1; i <= chuckCount; i++) {
OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
uploadPart.bucketName = uploadToBucket;
uploadPart.objectkey = uploadObjectkey;
uploadPart.uploadId = uploadId;
uploadPart.partNumber = i; // パート番号は 1 から始まります
NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
[readHandle seekToFileOffset:offset * (i -1)];
NSData* data = [readHandle readDataOfLength:offset];
uploadPart.uploadPartData = data;
OSSTask * uploadPartTask = [client uploadPart:uploadPart];
[uploadPartTask waitUntilFinished];
if (!uploadPartTask.error) {
OSSUploadPartResult * result = uploadPartTask.result;
uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:uploadPart.uploadPartFileURL.absoluteString error:nil] fileSize];
[partInfos addObject:[OSSPartInfo partInfoWithPartNum:i eTag:result.eTag size:fileSize]];
} else {
NSLog(@"upload part error: %@", uploadPartTask.error);
return;
}
}
OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
complete.bucketName = uploadToBucket;
complete.objectKey = uploadObjectkey;
complete.uploadId = uploadId;
complete.partInfos = partInfos;
// マルチパートアップロードを完了するときに、同名の既存オブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名の既存オブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名の既存オブジェクトは上書きされません。同名のオブジェクトが既に存在する場合、プログラムはエラーを報告します。
complete.completeMetaHeader = @{@"x-oss-forbid-overwrite": @"true"};
OSSTask * completeTask = [client completeMultipartUpload:complete];
[[completeTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"multipart upload success!");
} else {
NSLog(@"multipart upload error: %@", task.error);
}
return nil;
}] waitUntilFinished];関連ドキュメント
シンプルなアップロードの API 操作の詳細については、「PutObject」をご参照ください。
オブジェクトのコピーの API 操作の詳細については、「CopyObject」をご参照ください。
完全なマルチパートアップロードは、3 つの API 操作で構成されます。詳細については、次のトピックをご参照ください。
マルチパートアップロードイベントを開始するための API 操作の詳細については、「InitiateMultipartUpload」をご参照ください。
パートをアップロードするための API 操作の詳細については、「UploadPart」をご参照ください。
マルチパートアップロードを完了するための API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。
OSSClient インスタンスの初期化方法の詳細については、「OSSClient インスタンスの初期化」をご参照ください。