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

Object Storage Service:OSS SDK for PHPを使用したマルチパートアップロードの実行. OSS SDK for PHPを使用したマルチパートアップロードの実行

最終更新日:Mar 11, 2024

Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。

手順

マルチパートアップロードを使用してオブジェクトをアップロードするには、次の手順を実行します。

  1. マルチパートアップロードタスクを初期化します。

    $ossClient->initiateMultipartUploadを呼び出して、OSSで一意のアップロードIDを取得します。

  2. パーツをアップロード

    $ossClient->uploadPartを呼び出してパーツをアップロードします。

    説明
    • 特定のアップロードIDを持つマルチパートアップロードタスクによってパーツがアップロードされる場合、オブジェクト内のパーツの相対位置を識別するためにパーツ番号が使用されます。 既存の部品と同じ部品番号を持つ部品をアップロードすると、既存の部品はアップロードされた部品によって上書きされます。

    • OSSは、レスポンスのETagヘッダーにアップロードされた各パーツのMD5ハッシュを含めます。

    • OSSは、アップロードされたデータのMD5ハッシュを計算し、MD5ハッシュをOSS SDK for Javaによって計算されたMD5ハッシュと比較します。 2つのハッシュが異なる場合、OSSはInvalidDigestエラーコードを返します。

  3. マルチパートアップロードタスクを完了します。

    $ossClient->completeMultipartUploadを呼び出して、すべてのパーツを完全なオブジェクトに結合します。

マルチパートアップロードタスクの完全なサンプルコード

次のサンプルコードは、マルチパートアップロードプロセスに従ってマルチパートアップロードタスクを実装する方法の例を示しています。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。OSS\Core\OssUtilを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
$object = 'exampledir/exampleobject.txt ';
// アップロードするローカルファイルのフルパスを指定します。 
$uploadFile = 'D :\\ localpath\\examplefile.txt ';
$initOptions=配列 (
    OssClient::OSS_HEADERS => 配列 (
        // オブジェクトのダウンロード時のwebページのキャッシュ動作を指定します。 
        // 'Cache-Control' => 'no-cache' 、
        // オブジェクトのダウンロード時にオブジェクトの名前を指定します。 
        // 'Content-Disposition' => 'attachment;filename=oss_download.jpg '、
        // オブジェクトのダウンロード時のオブジェクトのコンテンツエンコーディング形式を指定します。 
        // 'Content-Encoding' => 'utf-8' 、
        // リクエストの有効期間を指定します。 単位:ミリ秒。 
        // 'Expires' => 150、
        // マルチパートアップロードタスクの初期化時に、マルチパートアップロードを使用してアップロードされたオブジェクトが、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターをtrueに設定します。これは、既存のオブジェクトと同じ名前を持つアップロードされたオブジェクトが既存のオブジェクトを上書きしないことを指定します。 
        // 'x-oss-forbid-overwrite' => 'true' 、
        // オブジェクトの各部分の暗号化に使用するサーバー側の暗号化方法を指定します。 
        // 'x-oss-server-side-encryption'=> 'KMS' 、
        // オブジェクトの暗号化に使用するアルゴリズムを指定します。 
        // 'x-oss-server-side-data-encryption'=>'SM4' 、
        // key Management Service (KMS) が管理するカスタマーマスターキー (CMK) のIDを指定します。 
        // 'x-oss-server-side-encryption-key-id' => '9468da86-3509-4f8d-a61e-6eab1eac **** '、
        // オブジェクトのストレージクラスを指定します。 
        // 'x-oss-storage-class' => 'Standard' 、
        // オブジェクトのタグを指定します。 オブジェクトに対して一度に複数のタグを指定できます。 
        // 'x-oss-tagging' => 'TagA=A&TagB=B' 、
    ),
);

/**
 * ステップ1: マルチパートアップロードタスクを開始し、アップロードIDを取得します。 
 * /
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);
    // アップロードIDを取得します。 アップロードIDは、マルチパートアップロードタスクの一意の識別子です。 アップロードIDに基づいて、マルチパートアップロードタスクのキャンセルやクエリなどの関連操作を実行できます。 
    $uploadId = $ossClient->initiateMultipartUpload($bucket、$object、$initOptions);
    print("initiateMultipartUpload OK") 。 "\n");
    // マルチパートアップロードタスクをキャンセルするか、アップロードIDに基づいてアップロードされたパーツをリストします。 
    // アップロードIDに基づいてマルチパートアップロードタスクをキャンセルする場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後にアップロードIDを取得します。  
    // アップロードIDに基づいてマルチパートアップロードタスクでアップロードされたパーツを一覧表示する場合は、InitiateMultipartUpload操作を呼び出してマルチパートアップロードタスクを開始した後、CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得します。 
    // print("UploadId: ") 。 $uploadId。 "\n");
} catch(OssException $e) {
    printf($e->getMessage()) 。 "\n");
    戻ります。}

/*
 * Step 2: Upload parts. 
 * /
$partSize = 10*1024*1024;
$uploadFileSize = sprintf('% u',filesize($uploadFile));
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize、$partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($i => $pieceとして $pieces) {
    $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
    $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
    $upOptions = array(
        // Upload the object. 
        $ossClient::OSS_FILE_UPLOAD => $uploadFile,
        // 部品番号を指定します。 
        $ossClient::OSS_PART_NUM => ($i + 1),
        // マルチパートアップロードタスクの開始位置を指定します。 
        $ossClient::OSS_SEEK_TO => $fromPos,
        // オブジェクトの長さを指定します。 
        $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
        // MD5検証を有効にするかどうかを指定します。 値trueは、MD5検証が有効であることを指定します。 
        $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
    );
    // Enable MD5 verification. 
    if ($isCheckMd5) {
        $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
        $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
    }
    try {
        // Upload the parts. 
        $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
        printf("initiateMultipartUpload, uploadPart - part #{$ i} OK\n");
    } catch(OssException $e) {
        printf("initiateMultipartUpload, uploadPart - part #{$ i} FAILED\n");
        printf($e->getMessage()) 。 "\n");
        戻る;
    }

}
// $uploadPartsは、各パーツのETagとパーツ番号で構成される配列です。 
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
    $uploadParts[] = array(
        'PartNumber' => ($i + 1),
        'ETag' => $eTag,
    );
}
/**
 * ステップ3: マルチパートアップロードタスクを完了します。 
 * /
$comOptions ['header']=配列 (
    // マルチパートアップロードタスクが完了したときに、マルチパートアップロードを使用してアップロードされたオブジェクトが、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターをtrueに設定します。これは、既存のオブジェクトと同じ名前を持つアップロードされたオブジェクトが既存のオブジェクトを上書きしないことを指定します。 
    // 'x-oss-forbid-overwrite' => 'true' 、
    // x-oss-complete-allパラメーターをyesに設定すると、現在のアップロードIDを使用してアップロードされたすべてのパーツが一覧表示され、パーツ番号でパーツが並べ替えられ、CompleteMultipartUpload操作が実行されます。 
    // 'x-oss-complete-all'=> 'yes'
);

try {
    // CompleteMultipartUpload操作には、$uploadPartsパラメーターのすべての有効な値が必要です。 OSSが $uploadPartsパラメーターの値を受け取ると、OSSはすべてのパーツを1つずつ検証します。 すべての部品が検証された後、OSSは部品を完全なオブジェクトに結合します。 
    $ossClient->completeMultipartUpload($bucket、$object、$uploadId、$uploadParts、$comOptions);
    printf (「完全マルチパートアップロードOK\n」);
} catch(OssException $e) {
    printf("完全マルチパートアップロードFAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
           

マルチパートアップロードを使用してローカルファイルをアップロードする

次のサンプルコードは、マルチパートアップロードを実行してローカルファイルをOSSにアップロードする方法の例を示しています。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
$object = 'exampledir/exampleobject.txt ';
// アップロードするローカルファイルのフルパスを指定します。 
$file = 'D :\\ localpath\\examplefile.txt ';

$options=配列 (
    OssClient::OSS_CHECK_MD5 => true,
    OssClient::OSS_PART_SIZE => 1、);
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    $ossClient->multiuploadFile($bucket、$object、$file、$options);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 

マルチパートアップロードを実行してローカルディレクトリをアップロードする

次のサンプルコードは、マルチパートアップロードを実行して、ディレクトリ内のすべてのファイルを含むローカルディレクトリをOSSにアップロードする方法の例を示しています。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';
// アップロードするローカルディレクトリのフルパスを指定します。 
$localDirectory = "D :\\ localpath";
// ディレクトリのプレフィックスを指定します。 
$prefix = "samples/codes/";
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    $ossClient->uploadDir($bucket、$prefix、$localDirectory);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 

マルチパートアップロードタスクのキャンセル

$ossClient->abortMultipartUploadメソッドを使用して、マルチパートアップロードタスクをキャンセルできます。 マルチパートアップロードタスクがキャンセルされた場合、アップロードIDを使用してパーツをアップロードすることはできません。 さらに、アップロードされたパーツは削除されます。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
$object = 'exampledir/exampleobject.txt ';
// アップロードIDを指定します。 例: 0004B999EF518A1FE585B0C9360D **** 。 InitiateMultipartUpload操作の応答からアップロードIDを取得できます。 
$upload_id = '0004B999EF518A1FE585B0C9360D **** ';

try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    $ossClient->abortMultipartUpload($bucket、$object、$upload_id);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 

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

listPartsメソッドを使用して、指定したアップロードIDを使用してアップロードされたすべてのパーツを一覧表示できます。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
$object = 'exampledir/exampleobject.txt ';
// アップロードIDを指定します。 例: 0004B999EF518A1FE585B0C9360D **** 。 InitiateMultipartUpload操作の応答からアップロードIDを取得できます。 CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得する必要があります。 
$upload_id = '0004B999EF518A1FE585B0C9360D **** ';

try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    $listPartsInfo = $ossClient->listParts($bucket, $object, $uploadId);
    foreach ($listPartsInfo->getListPart() as $partInfo) {
        print($partInfo->getPartNumber()) 。 "\t" $partInfo->getSize() 。 "\t" $partInfo->getETag() 。 "\t" $partInfo->getLastModified() 。 "\n");
    }
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 

マルチパートアップロードタスクの一覧表示

listMultipartUploadsメソッドを使用して、進行中のすべてのマルチパートアップロードタスクを一覧表示できます。 進行中のマルチパートアップロードタスクは、開始されたが完了またはキャンセルされていないタスクです。

<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。  
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = 'https:// oss-cn-hangzhou.aliyuncs.com ';
// バケットの名前を指定します。 例: examplebucket. 
$bucket= 'examplebucket';

$options=配列 (
    'delimiter' => '/',
    'max-uploads' => 100,
    'key-marker' => '',
    'prefix' => '',
    'upload-id-marker' => ''
);
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    $listMultipartUploadInfo = $ossClient->listMultipartUploads($bucket、$options);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": listMultipartUploads FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
printf(__FUNCTION__) 。 ": listMultipartUploads OK\n");
$listUploadInfo = $listMultipartUploadInfo->getUploads();
var_dump($listUploadInfo); 

次の表に、上記のサンプルコードの $optionsに含まれるパラメーターを示します。

パラメーター

説明

区切り文字

オブジェクト名のグループ化に使用される区切り文字。 プレフィックスからの同じ文字列と次に発生する区切り文字が名前に含まれるオブジェクトは、commonPrefixesパラメーターで単一の結果要素としてグループ化されます。

キーマーカー

次のリストが始まる位置。 このパラメーターは、upload-id-markerパラメーターと一緒に使用して、名前がkey-markerの値よりアルファベット順に大きいオブジェクトのすべてのマルチパートアップロードタスクを一覧表示します。 このパラメーターは、upload-id-markerパラメーターと一緒に使用して、次のリストの開始位置を指定します。

max-uploads

現在のリストに対して返すマルチパートアップロードタスクの最大数。 最大値は 1000 です。 デフォルト値は 1000 です。

プレフィックス

返されるオブジェクトの名前に含める必要があるプレフィックス。

説明

クエリにプレフィックスを使用する場合、返されるオブジェクト名にはプレフィックスが含まれます。

upload-id-marker

リストを開始するマルチパートアップロードタスクのアップロードID。 このパラメーターは、key-markerパラメーターと一緒に使用されます。 key-markerパラメーターが指定されていない場合、upload-id-markerパラメーターは無効です。 key-markerパラメーターが指定されている場合、クエリ結果は次のとおりです。

  • 名前がkey-markerの値よりアルファベット順に大きいすべてのオブジェクト

  • キーマーカーの値と同じオブジェクト名とアップロードidがupload-id-markerの値より大きいすべてのマルチパートアップロードタスク

参考資料

  • マルチパートアップロードの実行に使用する完全なサンプルコードについては、『GitHub』をご参照ください。

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

  • マルチパートアップロードタスクをキャンセルするために呼び出すことができるAPI操作の詳細については、「AbortMultipartUpload」をご参照ください。

  • アップロードされたパーツを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListParts」をご参照ください。

  • 実行中のすべてのマルチパートアップロードタスクを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListMultipartUploads」をご参照ください。 進行中のマルチパートアップロードタスクは、開始されたが完了またはキャンセルされていないタスクです。