このトピックでは、マルチパートアップロードの使用方法について説明します。

マルチパートアップロードの完全なコードは、GitHub をご参照ください。

マルチパートアップロードを有効にするには、次の手順を実行します。

  1. マルチパートアップロードイベントを開始します。

    ossClient.initiateMultipartUpload を呼び出すと、OSS で作成されたグローバルに一意の uploadId が返されます。

  2. パートをアップロードします。

    ossClient.uploadPart を呼び出して、パートデータをアップロードします。

    • 同じ uploadId を持つパートの場合、パート番号によってパートが順序付けされます。 あるパートをアップロードし、同じパート番号を使用して別のパートをアップロードすると、後のパートが前のパートに置き換わります。
    • OSS は パートデータの MD5 値を ETag に保存し、MD5 値をユーザーに返します。
    • SDK は自動的に Content-MD5 を設定します。 OSS はアップロードされたデータの MD5 値を計算し、SDK で計算された MD5 値と比較します。 2 つの値が異なると、エラーコード InvalidDigest が返されます。
  3. マルチパートアップロードを完了します。

    すべてのパートをアップロードした後、partossClient.completeMultipartUpload を呼び出して各パートを 1 つの完全なオブジェクトとして結合します。

次のコード例を使用して、マルチパートアップロードのプロセスを説明します。

// This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
String objectName = "<yourObjectName>";

// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

/* Step 1: Initiate a multipart upload event.
*/
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
// An uploadId is returned. It is the unique identifier for a part upload event. You can initiate related operations (such as part upload cancelation and query) based on the uploadId.
String uploadId = result.getUploadId();

/* Step 2: Upload parts.
*/
// partETags is a set of PartETags. A PartETag consists of an ETag and a part number.
List<PartETag> partETags =  new ArrayList<PartETag>();
// Calculate the total number of parts.
final long partSize = 1 * 1024 * 1024L;   // 1MB
final File sampleFile = new File("<localFile>");
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize ! = 0) {
    partCount++;
 }
// Upload each part simultaneously until all parts are uploaded.
for (int i = 0; i < partCount; i++) {
    long startPos = i * partSize;
    long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
    InputStream instream = new FileInputStream(sampleFile);
    // Skip parts that have been uploaded.
    instream.skip(startPos);
    UploadPartRequest uploadPartRequest = new UploadPartRequest();
    uploadPartRequest.setBucketName(bucketName);
    uploadPartRequest.setKey(objectName);
    uploadPartRequest.setUploadId(uploadId);
    uploadPartRequest.setInputStream(instream);
    // Configure the size available for each part. Aside from the last part, all parts are sized 100 KB at least.
    uploadPartRequest.setPartSize(curPartSize);
    // Configure part numbers. Each part is configured with a part number. The value can be from 1 to 10,000. If you configure a number beyond the range, OSS returns an InvalidArgument error code.
    uploadPartRequest.setPartNumber( i + 1);
    // Do not upload each part sequentially. They can be uploaded from different OSSClients. Then they are sequenced and combined into a complete object based on part numbers.
    UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
    // After you upload a part, OSS returns a result that contains a PartETag. The PartETag is stored in partETags.
    partETags.add(uploadPartResult.getPartETag());
}

/* Step 3: Complete multipart upload.
*/
// Sequence parts. partETags must be sequenced by part numbers in ascending order.
Collections.sort(partETags, new Comparator<PartETag>() {
    public int compare(PartETag p1, PartETag p2) {
        return p1.getPartNumber() - p2.getPartNumber();
    }
});
// You must provide all valid PartETags when you perform this operation. OSS verifies the validity of all parts one by one after it receives PartETags. After part verification is successful, OSS combines these parts into a complete object.
CompleteMultipartUploadRequest completeMultipartUploadRequest =
        new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
ossClient.completeMultipartUpload(completeMultipartUploadRequest);

// Close your OSSClient.
ossClient.shutdown();
		

マルチパートアップロードイベントのキャンセル

ossClient.abortMultipartUpload を呼び出して、マルチパートアップロードイベントをキャンセルします。 マルチパートアップロードイベントをキャンセルすると、この uploadId を使用して他の操作を実行することはできなくなります。 アップロード済みのパートは削除されます。

マルチパートアップロードイベントをキャンセルするには、次のコードを実行します。

// This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// Cancel multipart upload. The uploadId is from InitiateMultipartUpload.
AbortMultipartUploadRequest abortMultipartUploadRequest =
        new AbortMultipartUploadRequest("<yourBucketName>", "<yourObjectName>", "<uploadId>");
ossClient.abortMultipartUpload(abortMultipartUploadRequest);

// Close your OSSClient.
ossClient.shutdown();
			

アップロードしたパートの一覧表示

ossClient.listParts を呼び出して、指定した uploadId を持つすべてのアップロード済みパートを一覧表示します。

  • 簡易リスト

    簡易リストを表示するには、次のコードを実行します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // List uploaded parts. The uploadId is returned from InitiateMultipartUpload.
    ListPartsRequest listPartsRequest = new ListPartsRequest("<yourBucketName>", "<yourObjectName>", "<uploadId>");
     // Configure uploadId.
     //listPartsRequest.setUploadId(uploadId);
     // Set the maximum number of parts that can be displayed on each page to 100. The default number is 1,000.
     listPartsRequest.setMaxParts(100);
     // Specify the initial position in the list. Only the parts with part numbers greater than this parameter value are listed.
     listPartsRequest.setPartNumberMarker(2);
    PartListing partListing = ossClient.listParts(listPartsRequest);
    
    for (PartSummary part : partListing.getParts()) {
        // Obtain part numbers.
        part.getPartNumber();
        // Obtain the size of part data.
        part.getSize();
        // Obtain ETag.
        part.getETag();
        // Obtain the latest time parts are modified.
        part.getLastModified();
    }
    
    // Close your OSSClient.
    ossClient.shutdown();
    					
  • アップロードされたすべてのパートの一覧表示

    デフォルトでは、listParts は一度に最大 1,000 個のパートを一覧表示できます。 1,000 を超えるアップロード済みパートを一覧表示するには、次のコードを実行します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // List all uploaded parts.
    PartListing partListing;
    ListPartsRequest listPartsRequest = new ListPartsRequest("<yourBucketName>", "<yourObjectName>", "<uploadId>");
    
    do {
        partListing = ossClient.listParts(listPartsRequest);
    
        for (PartSummary part : partListing.getParts()) {
            // Obtain part numbers.
            part.getPartNumber();
            // Obtain the part size.
            part.getSize();
            // Obtain ETag.
            part.getETag();
            // Obtain the latest time parts are modified.
            part.getLastModified();
        }
    // Specify the initial position for the list. Only the parts with part numbers greater than the initial value are listed.
    listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
    } while (partListing.isTruncated());
    
    // Close your OSSClient.
    ossClient.shutdown()
    					
  • アップロードされたすべてのパートを 1 ページまたは複数ページに一覧表示

    各ページに表示されるパートの最大数を指定するには、次のコードを実行します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // List all uploaded parts on one or more pages.
    PartListing partListing;
    ListPartsRequest listPartsRequest = new ListPartsRequest("<yourBucketName>", "<yourObjectName>", "<uploadId>");
    // Set the maximum number of parts displayed on each page to 100.
    listPartsRequest.setMaxParts(100);
    
    do {
        partListing = ossClient.listParts(listPartsRequest);
    
        for (PartSummary part : partListing.getParts()) {
            // Obtain part numbers.
            part.getPartNumber();
            // Obtain the part size.
            part.getSize();
            // Gets the etag of the slice.
            // Obtain ETag.
            // Obtain the latest time parts are modified.
            part.getLastModified();
        }
    
        listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
    
    } while (partListing.isTruncated());
    
    // Close your OSSClient.
    ossClient.shutdown();
    					

バケットのすべてのパートアップロードイベントの一覧表示

ossClient.listMultipartUploads を呼び出して、進行中のすべてのパートアップロードイベント (開始されたが、完了していないかキャンセルされたイベント) を一覧表示します。 次のパラメーターを設定できます。

パラメーター  説明 設定方法 
prefix 返されるオブジェクト名に含める必要があるプレフィックス。 クエリにプレフィックスを使用した場合、返されるオブジェクト名にはそのプレフィックスが含まれます。 ListMultipartUploadsRequest.setPrefix(String prefix)
delimiter オブジェクト名のグループ化に使用されるスラッシュ (/)。 指定されたプレフィックスと、最初のスラッシュ (/) の間にあるオブジェクトは commonPrefixes です。 ListMultipartUploadsRequest.setDelimiter(String delimiter)
maxUploads パートアップロードイベントの最大数。 設定できる最大値 (またはデフォルト値) は 1,000 です。 ListMultipartUploadsRequest.setMaxUploads(Integer maxUploads)
keyMarker アルファベット順で keyMarker 値より後の文字で名前が始まるオブジェクトのマルチパートアップロードイベントをすべてリストします。 このパラメーターを uploadIdMarker パラメーターと一緒に使用して、返される結果内の初期位置を指定できます。 ListMultipartUploadsRequest.setKeyMarker(String keyMarker)
uploadIdMarker このパラメーターを keyMarker パラメーターと一緒に使用して、返される結果内の初期位置を指定できます。 keyMarker を設定しない場合、uploadIdMarker パラメーターは無効です。 keyMarker を設定した場合、クエリ結果には以下が含まれます。
  • keyMarker 値より後の文字で名前が始まるすべてのオブジェクト。
  • アルファベット順で keyMarker 値と同じ文字で名前が始まり、uploadId の値が uploadIdMarker よりも大きいオブジェクト。
ListMultipartUploadsRequest.setUploadIdMarker(String uploadIdMarker)
  • 簡易リスト

    マルチパートアップロードイベントを一覧表示するには、次のコードを実行します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // Lists multipart upload events. You can list 1,000 parts by default.
    ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
    MultipartUploadListing multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);
    
    for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
        // Obtain uploadId.
        multipartUpload.getUploadId();
        // Obtain object names.
        multipartUpload.getKey();
        // Obtain the time part upload events are initiated.
        multipartUpload.getInitiated();
    }
    
    // Close your OSSClient.
    ossClient.shutdown();
    					

    返された結果の isTruncated 値が false の場合、nextKeyMarker と nextUploadIdMarker の値が返され、次のオブジェクト読み取りの初期位置として使用されます。 一度にすべてのパートアップロードイベントを取得できない場合、ページ区切りで一覧表示されます。

  • すべてのパートアップロードイベントの一覧表示

    デフォルトでは、listMultipartUploads は一度に最大 1,000 個のパートを一覧表示します。 1,000 を超えるパートを一覧表示するには、次のコードを実行してすべてのパートを一覧表示します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // Lists multipart upload events.
    MultipartUploadListing multipartUploadListing;
    ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
    
    do {
        multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);
    
        for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
            // Obtain uploadId.
            multipartUpload.getUploadId();
            // Obtain object names.
            multipartUpload.getKey();
            // Obtain the time part upload events are initiated.
            multipartUpload.getInitiated();
        }
    
        listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());
    
        listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
    } while (multipartUploadListing.isTruncated());
    
    // Close your OSSClient.
    ossClient.shutdown();
    					
  • パートアップロードイベントを 1 ページまたは複数ページに一覧表示

    パートアップロードイベントを 1 ページまたは複数ページに一覧表示するには、次のコードを実行します。

    // This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    
    // Create an OSSClient instance.
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // Lists multipart upload events.
    MultipartUploadListing multipartUploadListing;
    ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
    // Configure the number of part upload events that can be displayed on each page.
    listMultipartUploadsRequest.setMaxUploads(50);
    
    do {
        multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);
    
        for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
            // Obtain uploadId.
            multipartUpload.getUploadId();
            // Obtain object names.
            multipartUpload.getKey();
            // Obtain the time part upload events are initiated.
            multipartUpload.getInitiated();
        }
    
        listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());
        listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
    
    } while (multipartUploadListing.isTruncated());
    
    // Close your OSSClient.
    ossClient.shutdown();