マルチパートアップロードの完全なコードについては、『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 を呼び出して各パーツを完全なオブジェクトにまとめます。

次のコードは、マルチパートアップロードのプロセスを説明する完全な例です。

using Aliyun.OSS;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
var objectName = "<yourObjectName>";
var localFilename = "<yourLocalFilename>";
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
// Initiate the multipart upload.
var uploadId = "";
try
{
    // Specifiy the name and the bucket of the uploaded object. You can configure ObjectMeta when using InitiateMultipartUploadRequest. However, you do not need to specify the ContentLength.
    var request = new InitiateMultipartUploadRequest(bucketName, objectName);
    var result = client.InitiateMultipartUpload(request);
    uploadId = result.UploadId;
    // Print the UploadId
    Console.WriteLine("Init multi part upload succeeded");
    Console.WriteLine("Upload Id:{0}", result.UploadId);
}
} catch (Exception e) {
{
    Console.WriteLine("Init multi part upload failed, {0}", ex.Message);
}
// Calculate the total number of parts.
var partSize = 100 * 1024;
var fi = new FileInfo(localFilename);
var fileSize = fi.Length;
var partCount = fileSize / partSize;
if (fileSize % partSize ! = 0)
{
    partCount++;
}
// Start the multipart upload. partETags is a list of partETags. OSS verifies the validity of all parts one by one after it receives the partETags. After part verification is successful, OSS combines these parts into a complete object.
var partETags = new List<PartETag>();
try
{
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        for (var i = 0; i < partCount; i++)
        {
            var skipBytes = (long)partSize * i;
            // Locate to the start position of the upload.
            fs.Seek(skipBytes, 0);
            // Calculate the size of the uploaded part. The size of the last part is the size of the data remained after being splited by the part size.
            var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
            var request = new UploadPartRequest(bucketName, objectName, uploadId)
            {
                InputStream = fs,
                PartSize = size,
                PartNumber = i + 1
            };
            // Call the UploadPart interface to upload the object. The returned results contain the ETag value of the uploaded part.
            var result = client.UploadPart(request);
            partETags.Add(result.PartETag);
            Console.WriteLine("finish {0}/{1}", partETags.Count, partCount);
        }
        Console.WriteLine("Put multi part upload succeeded");
    }
}
} catch (Exception e) {
{
    Console.WriteLine("Put multi part upload failed, {0}", ex.Message);
}
// List uploaded parts.
try
{
    var listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
    var listPartsResult = client.ListParts(listPartsRequest);
    Console.WriteLine("List parts succeeded");
    // Upload each part simultaneously until all parts are uploaded.
    var parts = listPartsResult.Parts;
    foreach (var part in parts)
    {
        Console.WriteLine("partNumber: {0}, ETag: {1}, Size: {2}", part.PartNumber, part.ETag, part.Size);
    }
}
} catch (Exception e) {
{
    Console.WriteLine("List parts failed, {0}", ex.Message);
}
// Complete the multipart upload.
try
{
    var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
    foreach (var partETag in partETags)
    {
        completeMultipartUploadRequest.PartETags.Add(partETag);
    }
    var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
    Console.WriteLine("complete multi part succeeded");
}
} catch (Exception e) {
{
    Console.WriteLine("complete multi part failed, {0}", ex.Message);
}

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

マルチプラットフォームアップロードイベントをキャンセルするための完全なコードについては、『GitHub』をご参照ください。

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

using Aliyun.OSS;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
var objectName = "<yourObjectName>";
var uploadId = "";
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
// Initiate the multipart upload.
try
{
    var request = new InitiateMultipartUploadRequest(bucketName, objectName);
    var result = client.InitiateMultipartUpload(request);
    uploadId = result.UploadId;
    // Print the UploadId.
    Console.WriteLine("Init multi part upload succeeded");
    Console.WriteLine("Upload Id:{0}", result.UploadId);
}
} catch (Exception e) {
{
    Console.WriteLine("Init multi part upload failed, {0}", ex.Message);
}
// Cancel the multipart upload.
try
{
    var request = new AbortMultipartUploadRequest(bucketName, objectName, uploadId);
    client.AbortMultipartUpload(request);
    Console.WriteLine("Abort multi part succeeded, {0}", uploadId);
}
} catch (Exception e) {
{
    Console.WriteLine("Abort multi part failed, {0}", ex.Message);
}

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

アップロードされたパーツを一覧表示する完全なコードについては、『GitHub』をご参照ください。

次のコードを実行してアップロードされたパーツを一覧表示します。

using Aliyun.OSS;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
var objectName = "<yourObjectName>";
var uploadId = "<yourUploadId>";
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    PartListing listPartsResult = null;
    var nextMarker = 0;
    do 
    {
        var listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId) 
        {
            PartNumberMarker = nextMarker,
        };
        // List uploaded parts.
        listPartsResult = client.ListParts(listPartsRequest);
        Console.WriteLine("List parts succeeded");
        // Upload each part simultaneously until all parts are uploaded.
        var parts = listPartsResult.Parts;
        foreach (var part in parts)
        {
            Console.WriteLine("partNumber: {0}, ETag: {1}, Size: {2}", part.PartNumber, part.ETag, part.Size);
        }
        nextMarker = listPartsResult.NextPartNumberMarker;
    } while (listPartsResult.IsTruncated);
}
} catch (Exception e) {
{
    Console.WriteLine("List parts failed, {0}", ex.Message);
}

マルチパートアップロードイベントの一覧表示

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)

マルチプラットフォームアップロードイベント一覧表示の完全なコードについては、『GitHub』をご参照ください。

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

using Aliyun.OSS;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    MultipartUploadListing multipartUploadListing = null;
    var nextMarker = string.Empty;
    do
    {
        // List multipart upload events.
        var request = new ListMultipartUploadsRequest(bucketName)
        {
            KeyMarker = nextMarker,
        };
        multipartUploadListing = client.ListMultipartUploads(request);
        Console.WriteLine("List multi part succeeded");
        // List the information about multipart upload events.
        foreach (var mu in multipartUploadListing.MultipartUploads)
        {
            Console.WriteLine("Key: {0},  UploadId: {1}", mu.Key, mu.UploadId);
        }
        // If the returned result shows that the value of isTruncated is false, the values of nextKeyMarker and nextUploadIdMarker are returned and used as the initial position for the next object reading.
        nextMarker = multipartUploadListing.NextKeyMarker;
    } while (multipartUploadListing.IsTruncated);
}
catch (Exception ex)
{
    Console.WriteLine("List multi part uploads failed, {0}", ex.Message);
}

返される結果のプレフィックスと最大数を指定

次のコードを実行して、指定されたプレフィックスと返される結果の最大数を指定してマルチパートアップロードを実行します。

using Aliyun.OSS;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
// Define prefix.
var prefix = "<yourObjectPrefix>";
// Set the maximum number of returned result to 100.
var maxUploads = 100;
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    MultipartUploadListing multipartUploadListing = null;
    var nextMarker = string.Empty;
    do
    {
        // List multipart upload events. By default, 1,000 parts are listed.
        var request = new ListMultipartUploadsRequest(bucketName)
        {
            KeyMarker = nextMarker,
            // Specify the prefix.
            Prefix = prefix,
            // Specify the maximum number of returned result.
            MaxUploads = maxUploads,
        };
        multipartUploadListing = client.ListMultipartUploads(request);
        Console.WriteLine("List multi part succeeded");
        // List the information about each multipart upload event.
        foreach (var mu in multipartUploadListing.MultipartUploads)
        {
            Console.WriteLine("Key: {0},  UploadId: {1}", mu.Key, mu.UploadId);
        }
        nextMarker = multipartUploadListing.NextKeyMarker;
    } while (multipartUploadListing.IsTruncated);
}
catch (Exception ex)
{
    Console.WriteLine("List multi part uploads failed, {0}", ex.Message);
}