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

Object Storage Service:オブジェクトが同じ名前のオブジェクトによって上書きされないようにする

最終更新日:Mar 11, 2024

既定では、アクセス権限を持つ既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトはアップロードされたオブジェクトによって上書きされます。 このトピックでは、x-oss-forbid-overwriteリクエストヘッダーを設定して、オブジェクトをコピーするとき、または単純なアップロードまたはマルチパートアップロードを実行するときに、オブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法について説明します。

使用上の注意

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

単純なアップロードタスクでの上書きの防止

次のサンプルコードは、単純なアップロードを実行するときに、既存のオブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法の例を示しています。

// バケットの名前を指定します。 例: examplebucket. バケットの命名の詳細については、「バケットの命名規則」をご参照ください。 
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 オブジェクト命名規則の詳細については、「オブジェクト命名規則」をご参照ください。 
String objectKey = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのフルパスを指定します。 
文字列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 (メタデータ);

OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
    @オーバーライド
    public void onSuccess(PutObjectRequestリクエスト, PutObjectResult結果) {
        Log.d("PutObject", "UploadSuccess");
        Log.d("ETag", result.getETag());
        Log.d("RequestId", result.getRequestId());
    }

    @オーバーライド
    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());
        }
    }
});

オブジェクトコピータスクでの上書きの防止

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

// ソースバケットの名前を指定します。 
文字列srcBucketName = "srcbucket";
// ソースオブジェクトのフルパスを指定します。 
文字列srcObjectKey = "dir1/srcobject.txt";
// 宛先バケットの名前を指定します。 
文字列destBucketName = "destbucket";
// 宛先オブジェクトのフルパスを指定します。 
文字列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 (メタデータ);

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

    @オーバーライド
    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";
// アップロードするローカルファイルのフルパスを指定します。 
文字列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 (メタデータ);

InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
// アップロードIDを取得します。 アップロードIDは、マルチパートアップロードタスクを一意に識別します。 アップロードIDを使用して、マルチパートアップロードタスクのキャンセルやクエリなどの関連操作を実行できます。 
文字列uploadId = initResult.getUploadId();

// 単一部品のサイズを指定します。 単位:バイト 有効な値: 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=新しいRandomAccessFile(localFile、"r");
    long skip = (i-1) * partCount;
    raf.seek (スキップ);
    raf.readFully (データ、0、partCount);

    UploadPartRequest uploadPart = new UploadPartRequest();
    uploadPart.setBucketName(bucketName);
    uploadPart.setObjectKey(objectKey);
    uploadPart.setUploadId(uploadId);
    // 各パーツのパーツ番号を指定します。 数字は1から始まります。 各部品は部品番号を有する。 有効な値: 1 ~ 10000 
    uploadPart.setPartNumber(i);
    uploadPart.setPartContent (データ);
    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>() {
    @オーバーライド
    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 (メタデータ);
CompleteMultipartUploadResult completeResult = oss.com pleteMultipartUpload(complete); 

参考資料

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

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

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

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