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

Object Storage Service:オブジェクトのアップロード

最終更新日:Mar 18, 2024

このトピックでは、Object Storage Service (OSS) のバージョン管理が有効なバケットにオブジェクトをアップロードする方法について説明します。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。

  • オブジェクトをアップロードするには、oss:PutObject権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

簡易アップロード

オブジェクトがバージョン管理が有効なバケットにアップロードされると、OSSはオブジェクトのグローバルに一意なバージョンIDとしてランダムな文字列を生成し、レスポンスでx-oss-version-idヘッダーを返します。

バージョン管理が一時停止されたバケットにオブジェクトがアップロードされると、アップロードされたオブジェクトに対してnullのバージョン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";
$bucket= "<yourBucketName>";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: Example /test.txt。 
$object = "<yourObjectName>";
$content = "hello world";

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

try {
    // バージョン管理されたバケットにオブジェクトをアップロードします。 
    $ret = $ossClient->putObject($bucket, $object, $content);

    // オブジェクトのバージョンIDを表示します。 
    print("versionId:" .$ret[OssClient::OSS_HEADER_VERSION_ID]]);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}

print(__FUNCTION__) 。 ": OK" 。 "\n"); 

詳細は、「PutObject」をご参照ください。

追加アップロード

追加アップロードを使用してバージョン管理されたバケットにオブジェクトをアップロードする場合、次の項目に注意してください。

  • AppendObject操作は、現在のバージョンが追加可能オブジェクトであるオブジェクトに対してのみ呼び出すことができます。

  • AppendObject操作は、現在のバージョンが追加可能なオブジェクトではないオブジェクト、または追加可能なオブジェクトである以前のバージョンでは呼び出すことができません。 たとえば、現在のバージョンが通常のオブジェクトまたは削除マーカーであるオブジェクトに対して操作を呼び出すことはできません。

  • 現在のバージョンが追加可能なオブジェクトであるオブジェクトに対してAppendObject操作を呼び出した場合、OSSはそのオブジェクトの以前のバージョンを生成しません。

  • 現在のバージョンが追加可能オブジェクトであるオブジェクトに対してPutObjectまたはDeleteObject操作を呼び出すと、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";
$bucket= "<yourBucketName>";
$object = "<yourObjectName>";
// 最初の追加アップロード、2番目の追加アップロード、および3番目の追加アップロード後に取得されるオブジェクトコンテンツが、それぞれHello OSS、Hi OSS、およびOSS OKであることを指定します。 
$content_array = array('Hello OSS', 'Hi OSS', 'OSS OK');
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    // 最初の追加アップロードを実行します。 最初の追加アップロードの位置は0で、次の追加アップロードの位置は応答に含まれます。 次の追加アップロードの開始位置は、オブジェクトの現在の長さです。 
    $position = $ossClient->appendObject($bucket, $object, $content_array[0], 0);    
    $position = $ossClient->appendObject($bucket, $object, $content_array[1], $position);   
    $position = $ossClient->appendObject($bucket, $object, $content_array[2], $position);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 

追加アップロードの詳細については、「AppendObject」をご参照ください。

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

CompleteMultipartUpload操作を呼び出して、バージョン化されたバケットにアップロードしたオブジェクトのマルチパートアップロードタスクを完了すると、アップロードされたオブジェクトの一意のバージョンIDが生成され、レスポンスでx-OSS-version-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\Core\OssUtilを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$object = "<yourObjectName>";
// アップロードするローカルファイルのフルパスを指定します。 
$uploadFile = "<yourLocalFile>";

/**
 * ステップ1: マルチパートアップロードタスクを開始し、アップロードIDを取得します。 
 * /
try {
    $config=配列 (
        "provider" => $provider、
        "endpoint" => $end ポイント、
    );
    $ossClient = new OssClient($config);

    // アップロードIDを取得します。 アップロードIDは、マルチパートアップロードタスクを一意に識別します。 アップロードIDを使用して、マルチパートアップロードタスクのキャンセルやクエリなどの操作を実行できます。 
    $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": initiateMultipartUpload OK" 。 "\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検証が有効になっていることを示します。 falseの値は、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);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part #{$ i} FAILED\n");
        printf($e->getMessage()) 。 "\n");
        return;
    }
    printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part #{$ i} OK\n");
}
// $uploadPartsパラメーターは、各パーツのETagパラメーターとPartNumberパラメーターで構成される配列です。 
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
    $uploadParts[] = array(
        'PartNumber' => ($i + 1),
        'ETag' => $eTag,
    );
}
/**
 * ステップ3: マルチパートアップロードタスクを完了します。 
 * /
try {
    // CompleteMultipartUpload操作には、$uploadPartsパラメーターのすべての有効な値が必要です。 OSSが $uploadPartsパラメーターの値を受け取ると、OSSはすべてのパーツを1つずつ検証します。 すべてのパーツが検証に合格した場合、OSSはこれらのパーツを組み合わせて完全なオブジェクトにします。 
    $ret = $ossClient->completeMultipartUpload($bucket、$object、$uploadId、$uploadParts);
    // アップロードされたオブジェクトのバージョンIDを表示します。 
    print("versionId:" .$ret[OssClient::OSS_HEADER_VERSION_ID]]);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
printf(__FUNCTION__) 。 ": completeMultipartUpload OK\n"); 

マルチパートアップロードタスクでのAPI操作の詳細については、「InitiateMultipartUpload」、「UploadPart」、および「CompleteMultipartUpload」をご参照ください。