すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:同名オブジェクトの上書き禁止 (Android SDK)

最終更新日:Nov 30, 2025

デフォルトでは、必要なアクセス権限があれば、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトは上書きされます。このトピックでは、シンプルアップロード、オブジェクトのコピー、マルチパートアップロードなどのシナリオで、`x-oss-forbid-overwrite` リクエストヘッダーを設定してオブジェクトの上書きを禁止する方法について説明します。

注意事項

  • このトピックのサンプルコードを実行する前に、カスタムドメイン名や Security Token Service (STS) を使用するなどの方法で OSSClient インスタンスを作成する必要があります。詳細については、「初期化 (Android SDK)」をご参照ください。

シンプルアップロード

次のサンプルコードでは、シンプルアップロードを実行する際に、同名の既存オブジェクトが上書きされるのを防ぐ方法の例を示します。

// バケット名を入力します。例: examplebucket。バケットの命名規則の詳細については、「バケット」をご参照ください。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを入力します。バケット名は含めないでください。例: exampledir/exampleobject.txt。オブジェクトの命名規則の詳細については、「オブジェクト」をご参照ください。
String objectKey = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを入力します。
String localFile = "/storage/emulated/0/oss/examplefile.txt";
// アップロードリクエストを作成します。
PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, localFile);
ObjectMetadata metadata = new ObjectMetadata();

// アップロード中に同名のオブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。
metadata.setHeader("x-oss-forbid-overwrite", "true");
put.setMetadata(metadata);

OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
    @Override
    public void onSuccess(PutObjectRequest request, PutObjectResult result) {
        Log.d("PutObject", "UploadSuccess");
        Log.d("ETag", result.getETag());
        Log.d("RequestId", result.getRequestId());
    }

    @Override
    public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // リクエストは失敗しました。
        if (clientExcepion != null) {
            // ネットワークエラーなどのクライアント例外が発生しました。
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // サーバー側例外が発生しました。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});

ファイルのコピー

次のサンプルコードでは、オブジェクトのコピータスクにおいて、バケット内の既存のオブジェクトが同名のオブジェクトによって上書きされるのを防ぐ方法の例を示します。

// ソースバケット名を入力します。
String srcBucketName = "srcbucket";
// バケット内のソースオブジェクトの完全なパスを入力します。
String srcObjectKey = "dir1/srcobject.txt";
// 宛先バケット名を入力します。
String destBucketName = "destbucket";
// バケット内の宛先オブジェクトの完全なパスを入力します。
String destObjectKey = "dir2/destobject.txt";
// コピーリクエストを作成します。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);

ObjectMetadata metadata = new ObjectMetadata();

// コピー操作中に同名のオブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。
metadata.setHeader("x-oss-forbid-overwrite", "true");
copyObjectRequest.setNewObjectMetadata(metadata);

// オブジェクトを非同期でコピーします。
OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback<CopyObjectRequest, CopyObjectResult>() {
    @Override
    public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
        Log.d("copyObject", "copy success!");
    }

    @Override
    public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // リクエストは失敗しました。
        if (clientExcepion != null) {
            // ネットワークエラーなどのクライアント例外が発生しました。
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // サービス例外が発生しました。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});

マルチパートアップロード

次のサンプルコードでは、マルチパートアップロードを使用して同名のオブジェクトをアップロードする際に、既存のオブジェクトが上書きされるのを防ぐ方法の例を示します。

// バケット名を入力します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを入力します。バケット名は含めないでください。例: exampledir/exampleobject.txt。
String objectKey = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを入力します。
String localFile = "/storage/emulated/0/oss/examplefile.txt";

// マルチパートアップロードを初期化します。
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, objectKey);
ObjectMetadata metadata = new ObjectMetadata();
// アップロード中に同名のオブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。
metadata.setHeader("x-oss-forbid-overwrite", "true");
init.setMetadata(metadata);

InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
// uploadId が返されます。uploadId は、マルチパートアップロードイベントの一意の識別子です。この uploadId を使用して、マルチパートアップロードのキャンセルやクエリなどの関連操作を実行できます。
String uploadId = initResult.getUploadId();

// 1つのパートのサイズをバイト単位で設定します。値は 100 KB から 5 GB の範囲である必要があります。
int partCount = 100 * 1024;
// パートをアップロードします。
List<PartETag> partETags = new ArrayList<PartETag>();
for (int i = 1; i < 5; i++) {
    byte[] data = new byte[partCount];

    RandomAccessFile raf = new RandomAccessFile(localFile, "r");
    long skip = (i-1) * partCount;
    raf.seek(skip);
    raf.readFully(data, 0, partCount);

    UploadPartRequest uploadPart = new UploadPartRequest();
    uploadPart.setBucketName(bucketName);
    uploadPart.setObjectKey(objectKey);
    uploadPart.setUploadId(uploadId);
    // パート番号を設定します。パート番号は 1 から始まります。アップロードされた各パートにはパート番号があります。値は 1 から 10,000 の範囲である必要があります。
    uploadPart.setPartNumber(i);
    uploadPart.setPartContent(data);
    try {
        UploadPartResult result = oss.uploadPart(uploadPart);
        PartETag partETag = new PartETag(uploadPart.getPartNumber(), result.getETag());
        partETags.add(partETag);
    } catch (ServiceException serviceException) {
        OSSLog.logError(serviceException.getErrorCode());
    }
}
Collections.sort(partETags, new Comparator<PartETag>() {
    @Override
    public int compare(PartETag lhs, PartETag rhs) {
        if (lhs.getPartNumber() < rhs.getPartNumber()) {
            return -1;
        } else if (lhs.getPartNumber() > rhs.getPartNumber()) {
            return 1;
        } else {
            return 0;
        }
    }
});

// マルチパートアップロードを完了します。
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, objectKey, uploadId, partETags);
metadata = new ObjectMetadata();
// アップロード完了時に同名のオブジェクトを上書きするかどうかを指定します。
// x-oss-forbid-overwrite を指定しない場合、デフォルトで同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を false に設定すると、同名のオブジェクトは上書きされます。
// x-oss-forbid-overwrite を true に設定すると、同名のオブジェクトは上書きされません。同名のオブジェクトが存在する場合、プログラムはエラーを報告します。
metadata.setHeader("x-oss-forbid-overwrite", "true");
complete.setMetadata(metadata);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);           

関連ドキュメント

  • シンプルアップロードを実行するために呼び出すことができる API 操作の詳細については、「PutObject」をご参照ください。

  • オブジェクトをコピーするために呼び出すことができる API 操作の詳細については、「CopyObject」をご参照ください。

  • OSSClient インスタンスを初期化する方法の詳細については、「初期化」をご参照ください。

  • マルチパートアップロードには 3つの API 操作が含まれます。操作の詳細については、次のトピックをご参照ください。

    • マルチパートアップロードを初期化する API 操作の説明については、「InitiateMultipartUpload」をご参照ください。

    • マルチパートアップロードのパートをアップロードするための API 操作の詳細については、「UploadPart」をご参照ください。

    • マルチパートアップロードを完了するための API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。