このトピックでは、バージョン管理が有効なバケットにオブジェクトをアップロードする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「OssClient の作成」をご参照ください。
オブジェクトをアップロードするには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
シンプルアップロード
バージョン管理が有効なバケットの場合、OSS は新しくアップロードされた各オブジェクトのバージョン ID として、グローバルに一意なランダムな文字列を生成します。この ID は、レスポンスヘッダーの x-oss-version-id フィールドで返されます。
バージョン管理が一時停止されているバケットの場合、OSS は新しくアップロードされた各オブジェクトに対して "null" というバージョン ID を生成します。同じ名前のオブジェクトをアップロードすると、新しいオブジェクトが前のオブジェクトを上書きします。これは、オブジェクトにはバージョンが 1 つしかなく、その ID が "null" であることを意味します。
次のコードは、シンプルアップロードを実行する方法を示しています。
<?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';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// オブジェクトの完全なパスを指定します。バケット名は含めないでください。例:example/test.txt
$object = "<yourObjectName>";
$content = "hello world";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
try {
// バージョン管理されたバケットにオブジェクトをアップロードします。
$ret = $ossClient->putObject($bucket, $object, $content);
// オブジェクトのバージョン情報を表示します。
print("versionId:" .$ret[OssClient::OSS_HEADER_VERSION_ID]);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");シンプルアップロードの詳細については、「PutObject」をご参照ください。
追加アップロード
バージョン管理されたバケット内のオブジェクトにデータを追加 (AppendObject) する場合は、次の点にご注意ください。
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';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$object = "<yourObjectName>";
// 1 回目、2 回目、3 回目の追加アップロード後、ファイルの内容はそれぞれ "Hello OSS"、"Hi OSS"、"OSS OK" になります。
$content_array = array('Hello OSS', 'Hi OSS', 'OSS OK');
try{
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$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");
return;
}
print(__FUNCTION__ . ": OK" . "\n");追加アップロードの詳細については、「AppendObject」をご参照ください。
マルチパートアップロード
バージョン管理されたバケットでは、CompleteMultipartUpload 操作を呼び出してマルチパートアップロードを完了できます。OSS はオブジェクト全体に対して一意のバージョン 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';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
use OSS\Core\OssUtil;
// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$object = "<yourObjectName>";
// ローカルファイルの完全なパスを指定します。
$uploadFile = "<yourLocalFile>";
/**
* ステップ 1:マルチパートアップロードイベントを初期化し、uploadId を取得します。
*/
try{
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// uploadId が返されます。uploadId は、マルチパートアップロードイベントの一意の識別子です。uploadId を使用して、マルチパートアップロードの中止やクエリなどの関連操作を実行できます。
$uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
} catch(OssException $e) {
printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");
/*
* ステップ 2:パートをアップロードします。
*/
$partSize = 10 * 1024 * 1024;
$uploadFileSize = sprintf('%u',filesize($uploadFile));
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($pieces as $i => $piece) {
$fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
$toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
$upOptions = array(
// アップロードするファイル。
$ossClient::OSS_FILE_UPLOAD => $uploadFile,
// パート番号を設定します。
$ossClient::OSS_PART_NUM => ($i + 1),
// アップロードするパートの開始位置を指定します。
$ossClient::OSS_SEEK_TO => $fromPos,
// ファイルの長さを指定します。
$ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
// MD5 検証を有効にするかどうかを指定します。true:有効、false:無効。
$ossClient::OSS_CHECK_MD5 => $isCheckMd5,
);
// MD5 検証を有効にします。
if ($isCheckMd5) {
$contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
$upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
}
try {
// パートをアップロードします。
$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 とパート番号で構成される配列です。
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
$uploadParts[] = array(
'PartNumber' => ($i + 1),
'ETag' => $eTag,
);
}
/**
* ステップ 3:アップロードを完了します。
*/
try {
// completeMultipartUpload 操作を呼び出すときは、すべての有効な $uploadParts を指定する必要があります。OSS は、送信された $uploadParts を受信した後、各パートの有効性を検証します。すべてのパートが検証されると、OSS はそれらを結合して完全なファイルを作成します。
$ret = $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
// オブジェクトのバージョン情報を表示します。
print("versionId:" .$ret[OssClient::OSS_HEADER_VERSION_ID]);
} catch(OssException $e) {
printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
printf($e->getMessage() . "\n");
return;
}
printf(__FUNCTION__ . ": completeMultipartUpload OK\n"); マルチパートアップロードの詳細については、InitiateMultipartUpload、UploadPart、CompleteMultipartUpload などの操作をご参照ください。