edit-icon download-icon

オブジェクトのアップロード

最終更新日: Dec 19, 2017

簡易アップロード

オブジェクトのアップロードを利用して OSSData を直接にアップロードできです。または、NSURL を利用してファイルをアップロードすることもできます。

  1. OSSPutObjectRequest * put = [OSSPutObjectRequest new];
  2. // 必須パラメーター
  3. put.bucketName = @"<bucketName>";
  4. put.objectKey = @"<objectKey>";
  5. put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  6. // put.uploadingData = <NSData *>; // NSData を直接にアップロード
  7. // オプションパラメーター、未指定可
  8. put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  9. // アップロード中のバイトの長さ、アップロードされたバイトの合計長さ、アップロードされる予定のバイトの合計長さ
  10. NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  11. };
  12. // Reference for the meanings of the following optional fields: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject
  13. // put.contentType = @"";
  14. // put.contentMd5 = @"";
  15. // put.contentEncoding = @"";
  16. // put.contentDisposition = @"";
  17. // put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // アップロードのメタ情報、またはその他の HTTP ヘッダーを設定
  18. OSSTask * putTask = [client putObject:put];
  19. [putTask continueWithBlock:^id(OSSTask *task) {
  20. if (!task.error) {
  21. NSLog(@"upload object success!");
  22. } else {
  23. NSLog(@"upload object failed, error: %@" , task.error);
  24. }
  25. return nil;
  26. }];
  27. // [putTask waitUntilFinished];
  28. // [put cancel];

ディレクトリにファイルをアップロード

OSS にはフォルダを使用しません。すべての要素はオブジェクトとして格納されます。ただし、シミュレートされたフォルダを作成するモードが用意されています。シミュレートされたフォルダの作成は、本質的に名前に “/“ が付いたオブジェクトの作成です。このオブジェクトは通常のオブジェクトとしてアップロードとダウンロードできますが、OSS コンソールでは、名前がスラッシュ(/)で終わるオブジェクトはすべてフォルダとして表示されます。

たとえば、ファイルをアップロードするときに、ObjectKey を folder/subfolder/file と書くと、そのファイルを folder/subfolder/ ディレクトリの “file” オブジェクトとしてアップロードするシミュレーションが行われます。

注:デフォルトパスは “ルートディレクトリ” で、”/“ で始める必要はありません。

Content-Type の設定とアップロード中の MD5 チェック有効化

アップロード処理中に Content-Type を明示的に設定することができます。それ以外の場合、SDK はオブジェクト名またはアップロードされた ObjectKey に従ってその値を決定します。さらに、オブジェクトをアップロードするときにContent-MD5 を設定すると、OSS はパラメータを使用して、受信したメッセージの内容が送信された内容と一致するかどうかをチェックします。SDK には、Base64 と MD5 の値を便利に計算できるメソッドが用意されています。

  1. OSSPutObjectRequest * put = [OSSPutObjectRequest new];
  2. // 必須パラメーター
  3. put.bucketName = @"<bucketName>";
  4. put.objectKey = @"<objectKey>";
  5. put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  6. // put.uploadingData = <NSData *>; // Directly upload NSData
  7. // Content-Type 設定 (オプション)
  8. put.contentType = @"application/octet-stream";
  9. // MD5 チェック設定 (オプション)
  10. put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // オブジェクトパスの場合
  11. // put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // バイナリデータの場合
  12. // アップロード進度設定 (オプション)
  13. put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  14. // アップロード中のバイトの長さ、アップロードされたバイトの合計長さ、アップロードされる予定のバイトの合計長さ
  15. NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  16. };
  17. OSSTask * putTask = [client putObject:put];
  18. [putTask continueWithBlock:^id(OSSTask *task) {
  19. if (!task.error) {
  20. NSLog(@"upload object success!");
  21. } else {
  22. NSLog(@"upload object failed, error: %@" , task.error);
  23. }
  24. return nil;
  25. }];
  26. // [putTask waitUntilFinished];
  27. // [put cancel];

追加アップロード

Append Object は追加モードでファイルをアップロードするために使用されます。オブジェクトの追加操作で作成されたオブジェクトのタイプは Appendable Object で、オブジェクトの Put 操作でアップロードされたオブジェクトのタイプは Normal Object です。

  1. OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];
  2. // 必須パラメーター
  3. append.bucketName = @"<bucketName>";
  4. append.objectKey = @"<objectKey>";
  5. append.appendPosition = 0; // 追加位置の指定
  6. NSString * docDir = [self getDocumentDirectory];
  7. append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  8. // オプションパラメーター
  9. append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  10. NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  11. };
  12. // 下記オプションの詳細、は [Append Object](~~31981~~) を参照してください。
  13. // append.contentType = @"";
  14. // append.contentMd5 = @"";
  15. // append.contentEncoding = @"";
  16. // append.contentDisposition = @"";
  17. OSSTask * appendTask = [client appendObject:append];
  18. [appendTask continueWithBlock:^id(OSSTask *task) {
  19. NSLog(@"objectKey: %@", append.objectKey);
  20. if (!task.error) {
  21. NSLog(@"append object success!");
  22. OSSAppendObjectResult * result = task.result;
  23. NSString * etag = result.eTag;
  24. long nextPosition = result.xOssNextAppendPosition;
  25. } else {
  26. NSLog(@"append object failed, error: %@" , task.error);
  27. }
  28. return nil;
  29. }];

アップロード後のコールバック通知

クライアントにオブジェクトをアップロードすると、OSS サーバーを設定して、アップロードリクエストの処理が完了したことをビジネスサーバーに通知できます。サーバーはコールバックを受信すると、コールバックの結果をクライアントに返します。単純なアップロードと比較して、コールバック通知を伴うアップロードでは、クライアントはコールバックリクエストと応答の処理に長い時間を要します。

詳細について、Callback を参照してください。

コード例:

  1. OSSPutObjectRequest * request = [OSSPutObjectRequest new];
  2. request.bucketName = @"<bucketName>";
  3. request.objectKey = @"<objectKey>";
  4. request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];
  5. // コールバックパラメーターの設定
  6. request.callbackParam = @{
  7. @"callbackUrl": @"<your server callback address>",
  8. @"callbackBody": @"<your callback body>"
  9. };
  10. // カスタム変数の設定
  11. request.callbackVar = @{
  12. @"<var1>": @"<value1>",
  13. @"<var2>": @"<value2>"
  14. };
  15. request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  16. NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  17. };
  18. OSSTask * task = [client putObject:request];
  19. [task continueWithBlock:^id(OSSTask *task) {
  20. if (task.error) {
  21. OSSLogError(@"%@", task.error);
  22. } else {
  23. OSSPutObjectResult * result = task.result;
  24. NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@",
  25. result.requestId,
  26. result.httpResponseHeaderFields,
  27. result.serverReturnJsonString);
  28. }
  29. return nil;
  30. }];

再開可能アップロード

ワイヤレスネットワーク接続では、通常、大きなオブジェクトをアップロードするのに長い時間がかかります。ネットワーク接続やネットワークの切り替えが不十分なため、アップロードが失敗することがあります。この場合、ファイル全体をもう一度アップロードする必要があります。この問題に対処するために、SDK は再開可能なアップロード機能を提供します。

再開可能アップロードは、OSS のマルチパートアップロードインタフェースによって異なります。ローカルデバイスに情報を保存しません。大きなファイルをアップロードする前に、InitMultipartUpload インターフェイスから UploadID を取得し、UploadID を使用して再開可能なアップロードインターフェイスを呼び出してファイルをアップロードします。例外などにアップロードプロセスが中断した場合は、同じ UploadID を使用して再開可能なアップロードインターフェイスを呼び出します。アップロードタスクは以前失敗した部分から自動的に再開されます。

アップロードが成功すると、UploadID は無効になります。同じ UploadID を使用して別のファイルをアップロードすると、ドメインは OSSClientErrorDomain、コードは OSSClientErrorCodeCannotResumeUpload の NSError が返されます。この場合、ファイルをアップロードするために新しい UploadID を取得する必要があります。

つまり、ファイルに対応する UploadID を保存して管理する必要があります。UploadID を取得する方法の詳細については、「マルチパートアップロード」セクションを参照してください。

再開可能なアップロードが失敗し、長時間再開されない場合、アップロードされた部分は OSS 上で無駄な断片になる可能性があります。このような状況では、タイムリーにフラグメントをクリアするためのバケットのライフサイクルルールを設定できます。詳細は、ライフサイクル管理 を参照してください。

再開可能アップロードは、InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUploadに依存します。STS 認証モードを使用する場合は、API の使用に必要なアクセス許可を追加します。

再開可能アップロードは、上記の一般的なアップロードコールバック通知と同様に、アップロード後のコールバック通知をサポートします。

注:再開可能アップロードは、携帯端末からの中小ファイルのアップロードにはお勧めできません。再開可能なアップロードでは、マルチパートのアップロード方法が採用され、1つのファイルをアップロードする複数のネットワーク要求が開始され、アップロードの効率が低下します。

  1. // Upload the file using the obtained UploadID. If the upload task fails and resumable upload is feasible, you can use the same UploadID to upload the same file to the same storage object on OSS
  2. OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];
  3. resumableUpload.bucketName = <bucketName>;
  4. resumableUpload.objectKey = <objectKey>;
  5. resumableUpload.partSize = 1024 * 1024;
  6. resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  7. NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  8. };
  9. NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
  10. resumableUpload.recordDirectoryPath = cachesDir;
  11. resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];
  12. OSSTask * resumeTask = [client resumableUpload:resumableUpload];
  13. [resumeTask continueWithBlock:^id(OSSTask *task) {
  14. if (task.error) {
  15. NSLog(@"error: %@", task.error);
  16. if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) {
  17. // If resumable upload is infeasible, you must obtain a new UploadID to upload the file all over again
  18. }
  19. } else {
  20. NSLog(@"Upload file success");
  21. }
  22. return nil;
  23. }];
  24. // [resumeTask waitUntilFinished];
  25. // [resumableUpload cancel];