このトピックでは、メモリまたはローカルディスクからオブジェクトをアップロードする方法について説明します。シンプルなアップロードでは、MD5 検証を実行してデータの整合性を確保することもできます。
使用上の注意
このトピックのサンプルコードを実行する前に、カスタムドメイン名または Security Token Service (STS) を使用する方法などを使用して、OSSClient インスタンスを作成する必要があります。詳細については、「初期化」をご参照ください。
バケットのリージョンは、初期化に指定されたエンドポイントによって決定されます。
権限
デフォルトでは、Alibaba Cloud アカウントにはすべての権限があります。Alibaba Cloud アカウントの RAM ユーザーまたは RAM ロールには、デフォルトでは権限がありません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたは バケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
PutObject |
| オブジェクトをアップロードします。 |
| オブジェクトをアップロードするときに、x-oss-tagging を介してオブジェクトタグを指定する場合、この権限が必要です。 | |
| オブジェクトをアップロードするときに、オブジェクトメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 | |
|
メモリまたはローカルディスクからオブジェクトをアップロードする
次のサンプルコードは、OSSData を直接アップロードする方法、または NSURL を使用してオブジェクトをアップロードする方法の例を示しています。
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// バケット名を指定します。例:examplebucket。
put.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// put.uploadingData = <NSData *>; // NSData を直接アップロードします。
// (オプション)アップロード進捗インジケーターを設定します。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
// アップロードされているバイト数、アップロードされたバイト数、およびアップロードする合計バイト数を指定します。
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// オプションフィールドを設定します。
// put.contentType = @"application/octet-stream";
// Content-MD5 を指定します。
// put.contentMd5 = @"eB5eJF1ptWaXm4bijSPyxw==";
// オブジェクトのエンコードに使用されるメソッドを指定します。
// put.contentEncoding = @"identity";
// オブジェクトコンテンツの表示に使用されるメソッドを指定します。
// put.contentDisposition = @"attachment";
// オブジェクトメタデータまたは HTTP ヘッダーを設定します。
// NSMutableDictionary *meta = [NSMutableDictionary dictionary];
// オブジェクトメタデータを指定します。
// [meta setObject:@"value" forKey:@"x-oss-meta-name1"];
// オブジェクトのアクセス制御リスト (ACL) を非公開に設定します。
// [meta setObject:@"private" forKey:@"x-oss-object-acl"];
// オブジェクトのストレージクラスを標準に設定します。
// [meta setObject:@"Standard" forKey:@"x-oss-storage-class"];
// このアップロードで、同じ名前の既存のオブジェクトを上書きすることを指定します。
// [meta setObject:@"true" forKey:@"x-oss-forbid-overwrite"];
// オブジェクトに 1 つ以上のタグを指定します。
// [meta setObject:@"a:1" forKey:@"x-oss-tagging"];
// Object Storage Service (OSS) がオブジェクトを作成するときに、デスティネーションオブジェクトの暗号化に使用されるサーバー側暗号化アルゴリズムを指定します。
// [meta setObject:@"AES256" forKey:@"x-oss-server-side-encryption"];
// Key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。このパラメーターは、x-oss-server-side-encryption を KMS に設定した場合にのみ有効になります。
// [meta setObject:@"9468da86-3509-4f8d-a61e-6eab1eac****" forKey:@"x-oss-server-side-encryption-key-id"];
// put.objectMeta = meta;
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;
}];
// waitUntilFinished は現在のスレッドの実行をブロックしますが、タスクの進行をブロックしません。
// [putTask waitUntilFinished];
// [put cancel];
ディレクトリにオブジェクトをアップロードする
OSS は、オブジェクトを格納するために階層構造ではなくフラット構造を使用します。ただし、OSS ではフォルダー階層をエミュレートできます。OSS コンソールでディレクトリを作成する場合、名前がスラッシュ (/) で終わるオブジェクトを作成できます。その後、ディレクトリにオブジェクトをアップロードできます。OSS コンソールには、名前がスラッシュ (/) で終わるオブジェクトがディレクトリとして表示されます。
たとえば、objectKey を folder/subfolder/file
に設定すると、「file」オブジェクトは folder/subfolder/
ディレクトリにアップロードされます。
デフォルトのパスはルートディレクトリで、名前はスラッシュ (/) で始まりません。
アップロード中に contentType を設定し、MD5 検証を有効にする
OSS サーバーが受信したデータがクライアントから送信されたデータと同じであることを確認するために、リクエストに contentMd5 ヘッダーを追加できます。OSS サーバーはこのヘッダーの値を使用して MD5 検証を実行します。オブジェクトをアップロードするときに、contentType を明示的に指定できます。contentType を明示的に指定しない場合、SDK はファイル名またはオブジェクト名に基づいてコンテンツタイプを自動的に決定します。
MD5 検証は OSS のパフォーマンスに悪影響を与えることに注意してください。
SDK は、オブジェクトコンテンツの Base64 エンコードされた MD5 ハッシュを取得するメソッドを提供します。次のサンプルコードは、オブジェクトコンテンツの Base64 エンコードされた MD5 ハッシュを取得する方法の例を示しています。
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// バケット名を指定します。例:examplebucket。
put.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。例:exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// NSData を直接アップロードします。
// put.uploadingData = <NSData *>;
// (オプション)contentType を設定します。
put.contentType = @"application/octet-stream";
// (オプション)MD5 検証を設定します。
// ファイルパスの MD5 ハッシュを指定します。
put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"];
// バイナリデータの MD5 ハッシュを指定します。
// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>];
// (オプション)アップロード進捗インジケーターを設定します。
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;
}];
// waitUntilFinished は現在のスレッドの実行をブロックしますが、タスクの進行をブロックしません。
// [putTask waitUntilFinished];
// [put cancel];