Object Body のアップロード

Object Body としてファイルをアップロードすると、Object とファイルを紐付けて管理できます。Object Body の機能概要については、Object Body の操作 をご覧ください。

Kii Cloud SDK は、以下の 2 種類の Object Body アップロード方法を提供しています。

いずれの方法でも、アップロード完了と同時に、Object に紐付く Object Body がアップロードしたデータに入れ替わります。このとき、既存の Object Body がある場合は、自動的に削除されます。また、同時更新となった場合は、後からアップロードが完了したデータになります(Object Body には楽観的ロックの仕組みはありません)。

中断/再開可能なアップロードでは、各 Object Body にサイズの上限はなく、合計サイズが料金プランのストレージ上限に達するまで格納できます。一括アップロードでは、100 MB までです(ただし、サーバーの安定動作のため、1 回のアップロードリクエストは 1 分程度までを目安としてください)。

中断/再開可能なアップロード

中断/再開が可能な Object Body のアップロードをする例を以下に挙げます。

  • // Create a KiiObject in an application-scope bucket.
    KiiObject object = Kii.bucket("AppBucket").object();
    
    // Set key-value pairs.
    object.set("title", "MyVideo");
    object.set("fileSize", 10485760);
    
    // Specify a file to upload.
    File localFile = new File(Environment.getExternalStorageDirectory(),
            "sample.mp4");
    
    // Create an uploader.
    KiiUploader uploader = object.uploader(getApplicationContext(),
            localFile);
    
    try {
      // Start uploading.
      uploader.transfer(new KiiRTransferProgressCallback() {
        @Override
        public void onProgress(KiiRTransfer operator, long completedInBytes, long totalSizeinBytes) {
          float progress = (float)completedInBytes / (float)totalSizeinBytes * 100.0f;
        }
      });
    } catch (AlreadyStartedException e) {
      // The upload is already in progress.
    } catch (SuspendedException e) {
      // The upload has been suspended because of a network error or user interruption.
    } catch (TerminatedException e) {
      // The upload has been terminated because of the missing file or user interruption.
    } catch (StateStoreAccessException e) {
      // Failed to access the local storage.
    }
  • // Create a KiiObject in an application-scope bucket.
    KiiObject object = Kii.bucket("AppBucket").object();
    
    // Set key-value pairs.
    object.set("title", "MyVideo");
    object.set("fileSize", 10485760);
    
    // Specify a file to upload.
    File localFile = new File(Environment.getExternalStorageDirectory(),
            "sample.mp4");
    
    // Create an uploader.
    KiiUploader uploader = object.uploader(getApplicationContext(),
            localFile);
    
    // Start uploading.
    uploader.transferAsync(new KiiRTransferCallback() {
      @Override
      public void onStart(KiiRTransfer operator) {
      }
    
      @Override
      public void onProgress(KiiRTransfer operator, long completedInBytes, long totalSizeinBytes) {
        float progress = (float) completedInBytes / (float) totalSizeinBytes * 100.0f;
      }
    
      @Override
      public void onTransferCompleted(KiiRTransfer operator, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
      }
    });

ここでは以下の処理を実施しています。

  • (必要に応じて)Object にキーと値のペアをセット。ファイル名、ファイルサイズ、Object Body の有無などを登録しておくことも可能。
  • アップロード対象ファイル(sample.mp4)のリファレンスを作成。
  • アップロード対象ファイルのリファレンスを指定して uploader メソッドを実行し、KiiUploader インスタンスを作成。
  • transfer メソッドを実行して、ファイルのアップロードを開始。

Object Body をすでに持つ Object に対して新たにファイルをアップロードした場合、このファイルにより Object Body が上書きされます。

onProgress メソッドは、転送の進捗状況に応じて呼び出されます。転送サイズが小さい場合は、1 回目の呼び出しで 100% の進捗を示すことがあります。

何らかの理由によりアップロードが中断した場合は SuspendedException が発生します。この場合、中断箇所よりアップロードの再開を行うことができます。再開方法については アップロードの再開 を参照してください。

一括アップロード

中断/再開を伴わない Object Body のアップロードを利用することも可能です(ただし、特にサイズの大きなファイルを Kii Cloud にアップロードするケースなどにおいては中断/再開可能なアップロードを利用することを推奨します)。

一括アップロードを行う例を以下に挙げます。

  • // Create a KiiObject in an application-scope bucket.
    KiiObject object = Kii.bucket("AppBucket").object();
    
    // Set key-value pairs.
    object.set("title", "MyImage");
    object.set("fileSize", 783204);
    
    try {
      // Save the KiiObject.
      object.save();
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
    
    // Specify a file to upload.
    File localFile = new File(Environment.getExternalStorageDirectory(),
            "myImage.jpg");
    
    try {
      // Start uploading.
      object.uploadBody(localFile, "image/jpeg");
    } catch (IOException e) {
      // Handle the error.
    } catch (AppException e) {
      // Handle the error.
    }
  • // Create a KiiObject in an application-scope bucket.
    KiiObject object = Kii.bucket("AppBucket").object();
    
    // Set key-value pairs.
    object.set("title", "MyImage");
    object.set("fileSize", 783204);
    
    // Save the KiiObject.
    object.save(new KiiObjectCallBack() {
      @Override
      public void onSaveCompleted(int token, KiiObject object, Exception exception) {
        if (exception != null) {
          // Handle the error.
          return;
        }
        // Specify a file to upload.
        File localFile = new File(Environment.getExternalStorageDirectory(),
                "myImage.jpg");
    
        // Start uploading.
        object.uploadBody(localFile, "image/jpeg", new KiiObjectBodyCallback() {
          @Override
          public void onTransferStart(KiiObject kiiObject) {
          }
    
          @Override
          public void onTransferProgress(KiiObject object, long completedInBytes, long totalSizeinBytes) {
            float progress = (float) completedInBytes / (float) totalSizeinBytes * 100.0f;
          }
    
          @Override
          public void onTransferCompleted(KiiObject object, Exception exception) {
            if (exception != null) {
              // Handle the error.
              return;
            }
          }
        });
      }
    });

ここでは以下の処理を実施しています。

  • (必要に応じて)Object にキーと値のペアをセット。ファイル名、ファイルサイズ、Object Body の有無などを登録しておくことも可能。
  • save メソッドを実行して、オブジェクトを保存。
  • アップロード対象ファイル(myImage.jpg)のリファレンスを作成。
  • uploadBody メソッドを実行して、ファイルのアップロードを開始。

uplaodBody メソッドを使用する場合は、事前に save メソッドによって Kii Cloud 上に Object を作成しておく必要があります。

ノンブロッキング API の onTransferProgress メソッドは、転送の進捗状況に応じて呼び出されます。転送サイズが小さい場合は、1 回目の呼び出しで 100% の進捗を示すことがあります。

Content-Type は "type/subtype" の形式で指定します。Kii Cloud に送信された Content-Type は、ダウンロード時や、公開された Object Body をブラウザで参照するときに使用されます。