獲取對象列表
功能說明
您可以使用 listObjects 接口列舉對象,每次最多返回1000個對象。
代碼示例
以下代碼展示如何簡單列舉對象:
public function ListObjects()
{
try {
$res = $this->s3Client->listObjects([
'Bucket' => '<your-bucket-name>',
]);
foreach ($res['Contents'] as $object) {
echo $object['Key'] . "\n";
}
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}如果 list 大于1000,則可以使用 getPaginator 接口列舉所有對象。列舉所有對象示例代碼如下:
public function ListObjects2()
{
try {
$results = $this->s3Client->getPaginator('ListObjectsV2', [
'Bucket' => '<your-bucket-name>',
]);
foreach ($results as $result) {
foreach ($result['Contents'] as $object) {
echo $object['Key'] . "\n";
}
}
} catch (Aws\S3\Exception\S3Exception $e) {
echo $e->getMessage() . "\n";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| Bucket | string | 設置桶名稱 | 是 |
返回結果
| 屬性名 | 類型 | 說明 |
|---|---|---|
| Contents | object array | 返回的對象數組,包含對象名,最后修改時間,ETag等信息 |
上傳對象
功能說明
您可以使用 putObject 接口上傳對象。
代碼示例
public function PutObject()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$res = $this->s3Client->putObject([
'Bucket' => $bucket,
'Key' => $objectName,
'Body' => "1234",
'ACL' => 'public-read', //設置 ACL 為公共讀
'ContentType' => "text/json", // 設置content-type
]);
echo $res;
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}上傳本地文件到對象存儲:
public function PutObjectLocalFile()
{
$file_Path = '<your-file-path>';
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$res = $this->s3Client->putObject([
'Bucket' => $bucket,
'Key' => $objectName,
'SourceFile' => $file_Path,
]);
echo $res;
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名 | 是 |
| Key | string | 對象名 | 是 |
| Body | string | 對象內容 | 否 |
| SourceFile | string | 要上傳的文件路徑 | 否 |
| ACL | string | 對象訪問權限,取值private | public-read | public-read-write | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| ETag | string | 對象的唯一標簽 |
下載對象
功能說明
您可以使用 getObject 接口下載對象。
代碼示例
public function GetObject()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
// $dateTime = new DateTime('<your-datetime>');
$res = $this->s3Client->getObject([
'Bucket' => $bucket,
'Key' => $objectName,
//'IfModifiedSince' => $dateTime, //指定晚于修改時間
//'IfMatch' => '<your-ETag>', //指定匹配的ETag
]);
echo $res->get('Body')->getContents();
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 執行本操作的桶名稱 | 是 |
| Key | string | 對象的key | 是 |
| IfModifiedSince | DateTime | 如果指定的時間早于實際修改時間,則正常傳送。否則返回304代碼 | 否 |
| IfUnmodifiedSince | DateTime | 如果傳入參數中的時間等于或者晚于文件實際修改時間,則正常傳輸文件;否則返回304代碼 | 否 |
| IfMatch | string | 如果傳入的ETag和Object的 ETag匹配,則正常傳輸;否則返回412代碼 | 否 |
| IfNoneMatch | string | 如果傳入的ETag值和Object的ETag不匹配,則正常傳輸;否則返回412代碼 | 否 |
下載文件時,可以指定一個或者多個限定條件,滿足條件時才下載對象,不滿足時則返回錯誤代碼,不下載對象。
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| Body | string | 對象數據內容 |
復制對象
功能說明
您可以使用 copyObject 接口復制對象,您需要設置復制的對象名,所在的桶以及目標桶和對象名。
代碼示例
復制一個對象
public function CopyObject()
{
$desBucket = '<your-bucket-name>'; //目標桶
$desKeyName = '<your-object-key>'; //目標對象名
$srcBucket = '<source-bucket-name>'; //從此桶復制
$srcKeyName = '<source-object-key>'; //復制的對象名
try {
$result = $this->s3Client->copyObject(array(
'Bucket' => $desBucket,
'Key' => $desKeyName,
'CopySource' => '/' . $srcBucket . '/' . $srcKeyName,
));
echo $result;
} catch (Aws\S3\Exception\S3Exception $e) {
echo $e->getMessage() . "\n";
}
}文件比較大(超過1GB)的情況下,直接使用copyObject 可能會出現超時,需要使用分片復制的方式進行文件復制。Aws\S3\MultiPartCopy封裝了分片復制的接口,可以用于分片復制文件,具體示例請參考 分片上傳融合接口 中的使用 MultiPartCopy 進行分片復制部分。
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 目標桶名稱 | 是 |
| Key | string | 目標對象key | 是 |
| CopySource | string | URL格式的復制對象數據來源,包含了桶名稱和對象key的信息,二者之間使用正斜桿(/)分割。例如,"/foo/boo"表示復制foo桶中的boo對象 | 是 |
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| ETag | string | 對象的唯一標簽 |
刪除對象
功能說明
您可以使用 deleteObject 接口刪除單個對象。
代碼示例
public function DeleteObject()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$res = $this->s3Client->deleteObject([
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo $res;
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名 | 是 |
| Key | string | 對象名 | 是 |
批量刪除對象
功能說明
您可以使用 deleteObjects 接口批量刪除多個對象。
代碼示例
public function DeleteObjects()
{
try {
$res = $this->s3Client->deleteObjects([
'Bucket' => '<your-bucket-name>',
'Delete' => [
'Objects' => [
[
'Key' => '<your-object-key1>',
],
[
'Key' => '<your-object-key2>',
],
]
],
]);
echo $res;
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Delete | Delete | 要刪除的對象key列表 | 是 |
獲取對象元數據
功能說明
您可以使用 headObject 接口獲取對象元數據。headObject 操作的請求參數與 getObject 類似,但是 headObject 返回的http響應中沒有對象數據。
代碼示例
public function HeadObject()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$res = $this->s3Client->headObject([
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo 'ETag: ' . $res->get('ETag') . "\n"; //打印對象ETag
echo 'ContentLength: ' . $res->get('ContentLength') . "\n"; //打印對象大小
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Exception: $e";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
返回結果
返回的屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| ContentLength | Integer | 本次請求返回對象數據的大小(單位:字節) |
| ContentType | String | 對象文件格式的標準MIME類型 |
| ETag | String | 對象的Entity Ttag |
| LastModified | Date | 最近一次修改對象的時間 |
| VersionId | String | 對象最新的版本ID |
設置對象訪問權限
功能說明
與桶訪問權限類似,對象訪問權限同樣具有 AccessControlList 與 CannedAccessControlList 兩種。需要注意的是,對象的訪問優先級要高于桶訪問權限。比如桶訪問權限是 private,但是對象訪問權限是 public read,則所有用戶都可以訪問該對象。默認情況下,只有對象的擁有者才能訪問該對象,即對象的訪問權限默認是 private。設置對象ACL操作需要具有對象的WRITE_ACP權限。
代碼示例
CannedAccesssControlList
使用 CannedAccesssControlList 設置桶的訪問權限示例代碼如下:
public function PutObjectAcl(){
//設置對象為公共讀寫
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$this->s3Client->putObjectAcl([
'ACL' => 'public-read',
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo "Succeed in setting object ACL.\n";
} catch (AwsException $e) {
echo $e->getMessage();
echo "\n";
}
}AccessControlList
使用 AccessControlList 設置對象訪問權限時,可以設置特定用戶對象的訪問權限。使用AccesssControlList設置對象的權限示例代碼如下:
public function PutObjectAcl2(){
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$this->s3Client->putObjectAcl([
'AccessControlPolicy' => [
'Grants' => [
[
//開啟用戶 exampleuser 的完全控制權限
'Grantee' => [
'ID' => 'exampleuser',
'Type' => 'CanonicalUser',
],
'Permission' => 'FULL_CONTROL',
],
[
//開啟所有用戶的讀權限
'Grantee' => [
'Type' => 'Group',
'URI' => '//acs.amazonaws.com/groups/global/AllUsers',
],
'Permission' => 'READ',
],
// ...
],
// 可以從 getObjectAcl 接口獲取 Owner 信息
'Owner' => [
'DisplayName' => 'exampleuser',
'ID' => 'Example DisplayName',
],
],
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo "Succeed in setting object ACL.\n";
} catch (AwsException $e) {
// Display error message
echo $e->getMessage();
echo "\n";
}
}請求參數
CannedAccesssControlList
使用 CannedAccesssControlList 方式設置桶權限參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象名 | 是 |
| ACL | string | CannedACL值 | 是 |
CannedAccesssControlList 是一系列的預定義訪問權限。
| ACL值 | 權限 |
|---|---|
| private | 私有讀寫 |
| public-read | 公共讀私有寫 |
| public-read-write | 公共讀寫 |
AccessControlList
使用 AccessControlList 方式設置桶權限參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象名 | 是 |
| AccessControlPolicy | AccessControlPolicy | acl詳細配置 | 是 |
在 AccessControlList 中可通過 Grants 設置權限,Grants 中關于Permission說明如下:
| Permission值 | 權限 |
|---|---|
| READ | 允許讀取對象數據和元數據 |
| WRITE | 不可作用于對象 |
| READ_ACP | 允許獲取對象的ACL信息 |
| WRITE_ACP | 允許修改對象的ACL信息 |
| FULL_CONTROL | 獲得READ、READ_ACP、WRITE_ACP權限 |
獲取對象訪問權限
功能說明
您可以使用 getObjectAcl 接口獲取對象訪問的權限。
代碼示例
public function GetObjectAcl(){
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
try {
$resp = $this->s3Client->getObjectAcl([
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo "Succeed in retrieving object ACL as follows: \n";
//打印獲取的對象 owner displayname,ID 以及訪問權限信息
echo 'Owner DisplayName: ' . $resp['Owner']['DisplayName'] . "\n";
echo 'Owner ID: ' . $resp['Owner']['ID'] . "\n";
foreach ($resp['Grants'] as $grant) {
echo "Grant: \n";
foreach($grant['Grantee'] as $k=>$val)
{
echo $k . ": " . $val . "\n";
}
echo 'Permission: ' . $grant['Permission'] . "\n";
}
} catch (AwsException $e) {
echo $e->getMessage();
echo "\n";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| VersionId | string | 設置標簽信息的對象的版本Id | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| Owner | Owner | 對象的owner信息 |
| Grants | Grants | 對象的訪問權限信息 |
獲取對象標簽
功能說明
您可以使用GetObjectTagging接口獲取對象標簽。
代碼示例
public function GetObjectTagging()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
$res = $this->s3Client->getObjectTagging([
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo "getObjectTagging success " . $res . "\n";
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| VersionId | string | 設置標簽信息的對象的版本Id | 否 |
返回參數
| 參數 | 類型 | 說明 |
|---|---|---|
| TagSet | TagSet | 設置的標簽信息,包含了一個Tag結構體的數組,每個Tag以Key-Value的形式說明了標簽的內容 |
刪除對象標簽
功能說明
您可以使用deleteObjectTagging接口刪除對象標簽。
代碼示例
public function DeleteObjectTagging()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
$this->s3Client->deleteObjectTagging([
'Bucket' => $bucket,
'Key' => $objectName,
]);
echo "deleteObjectTagging success\n";
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 執行本操作的桶名稱 | 是 |
| Key | string | 設置標簽信息的對象key | 是 |
| VersionId | string | 設置標簽信息的對象的版本Id | 否 |
設置對象標簽
功能說明
您可以使用putObjectTagging接口為對象設置標簽。標簽是一個鍵值對,每個對象最多可以有10個標簽。bucket的擁有者默認擁有給bucket中的對象設置標簽的權限,并且可以將權限授予其他用戶。每次執行PutObjectTagging操作會覆蓋對象已有的標簽信息。每個對象最多可以設置10個標簽,標簽Key和Value區分大小寫,并且Key不可重復。每個標簽的Key長度不超過128字節,Value長度不超過255字節。SDK通過HTTP header的方式設置標簽且標簽中包含任意字符時,需要對標簽的Key和Value做URL編碼。設置對象標簽信息不會更新對象的最新更改時間。
代碼示例
public function PutObjectTagging()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
$this->s3Client->putObjectTagging([
'Bucket' => $bucket,
'Key' => $objectName,
'Tagging' => [ // required
'TagSet' => [
[
'Key' => 'key1',
'Value' => 'value1',
],
]
],
]);
echo "putObjectTagging success\n";
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| Tagging | Tagging | 設置的標簽信息,包含了一個Tag結構體的數組,每個Tag以Key-Value的形式說明了標簽的內容 | 是 |
| VersionId | string | 設置標簽信息的對象的版本Id | 否 |
生成下載預簽名URL
功能說明
您可以通過 createPresignedRequest 接口為一個指定對象生成一個預簽名的下載鏈接。
代碼示例
生成下載預簽名URL:
public function generateGetobjectPresignedUrl()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
$expires = "+5 minutes"; // 表示5分鐘后過期
$cmd = $this->s3Client->getCommand('GetObject', [
'Bucket' => $bucket,
'Key' => $objectName,
]);
$request = $this->s3Client->createPresignedRequest($cmd, $expires);
$presignedUrl = (string)$request->getUri();
echo "generateGetobjectPresignedUrl success " . $presignedUrl . "\n";
}生成下載對象的預簽名URL后,可以通過該URL下載文件:
public function getObjUsingPresignedUrl($presignedUrl, $localFilePath)
{
try {
$objectContent = file_get_contents($presignedUrl);
?
if ($objectContent === false) {
$error = error_get_last();
echo "Download failed: " . $error['message'] . "\n";
return;
}
?
file_put_contents($localFilePath, $objectContent);
?
echo "Download successful. File saved to: " . $localFilePath . "\n";
} catch (Exception $e) {
echo "Download failed: " . $e->getMessage() . "\n";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| expires | int|string | 過期時間(Unix時間戳或者能用strtotime解析的字符串) | 是 |
返回結果
生成對應的預簽名下載 URL,該鏈接允許用戶在指定的時間內直接從媒體存儲下載對象。
生成上傳預簽名URL
功能說明
您可以通過 createPresignedRequest 接口為一個指定對象生成一個預簽名的上傳鏈接。
代碼示例
生成上傳預簽名URL:
public function generatePutobjectPresignedUrl()
{
$bucket = '<your-bucket-name>';
$objectName = '<your-object-key>';
$expires = time() + 300; // 當前時間戳加上300秒,表示5分鐘后過期
$cmd = $this->s3Client->getCommand('PutObject', [
'Bucket' => $bucket,
'Key' => $objectName,
]);
$request = $this->s3Client->createPresignedRequest($cmd, $expires);
$presignedUrl = (string)$request->getUri();
echo "generatePutobjectPresignedUrl success " . $presignedUrl . "\n";
}通過該預簽名URL,可以直接將文件上傳到指定的桶:
public function putObjUsingPresignedUrl($presignedUrl, $localFilePath)
{
if (!file_exists($localFilePath)) {
echo "File does not exist: " . $localFilePath . "\n";
return;
}
?
$file = fopen($localFilePath, 'r');
?
$ch = curl_init($presignedUrl);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFilePath));
?
$result = curl_exec($ch);
if ($result === false) {
echo "Upload failed: " . curl_error($ch) . "\n";
} else {
echo "Upload successful. File uploaded from: " . $localFilePath . "\n";
}
?
// 關閉資源
curl_close($ch);
fclose($file);
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| expires | int|string | 過期時間(Unix時間戳或者能用strtotime解析的字符串) | 是 |
返回結果
生成對應的預簽名上傳 URL,該鏈接允許用戶在指定的時間內直接將對象上傳到媒體存儲存儲桶。
Post上傳
功能說明
PostObjectV4接口為一個指定對象生成一個支持post方式上傳文件的參數集合,可以在前端使用post form-data的方式上傳文件。
代碼示例
public function postPresign() {
$objectName = '<your-object-key>';
$formInputs = [
'key' => $objectName
];
$options = [
['starts-with', '$bucket', ''],
['starts-with', '$key', ''],
['starts-with', '$acl', ''],
['starts-with', '$Content-Type', ''],
];
?
$expires = '+2 hours';
$postObject = new Aws\S3\PostObjectV4(
$this->s3Client,
'<your-bucket-name>',
$formInputs,
$options,
$expires
);
?
$formAttributes = $postObject->getFormAttributes();
$formInputs = $postObject->getFormInputs();
var_dump($formAttributes);
var_dump($formInputs);
}請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| Bucket | string | 桶名稱 | 是 |
| formInputs | array | 前端輸入參數,用于配置acl,ContentType | 是,可以為空 |
| options | array | 參數策略,可以限制輸入的參數,至少需要指定bucket | 是 |
| expires | string | 過期時間,能用strtotime解析的字符串 | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|---|---|
| FormAttributes | FormAttributes | 請求上傳的url,http方法等 |
| FormInputs | FormInputs | 前端輸入參數,包括v4簽名和policy |
關于FormAttributes的說明:
| 參數 | 類型 | 說明 |
|---|---|---|
| action | string | 請求上傳的url |
關于FormInputs的說明:
| 參數 | 類型 | 說明 |
|---|---|---|
| Policy | string | 服務端用于校驗的policy |
| X-Amz-Algorithm | string | v4簽名,哈希算法 |
| X-Amz-Signature | string | v4簽名,請求的參數簽名 |
| X-Amz-Date | string | v4簽名,日期信息 |
| X-Amz-Credential | string | v4簽名,ak信息 |
前端使用方式如下:
<form action="<action>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="Policy" value="<data.fields['Policy']>" />
<input type="hidden" name="X-Amz-Algorithm" value="<data.fields['X-Amz-Algorithm']>" />
<input type="hidden" name="X-Amz-Credential" value="<data.fields['X-Amz-Credential']>" />
<input type="hidden" name="X-Amz-Date" value="<data.fields['X-Amz-Date']>" />
<input type="hidden" name="X-Amz-Signature" value="<data.fields['X-Amz-Signature']>" />
<input type="hidden" name="bucket" value="<data.fields['bucket']>" />
<input type="hidden" name="key" value="<data.fields['key']>" />
?
<input type="file" name="file" value="" />
<input type="submit" value="Submit" />
</form>獲取多版本對象列表
功能說明
如果桶開啟了版本控制,您可以使用 listObjectVersions 接口列舉對象的版本,每次list操作最多返回1000個對象版本。
代碼示例
以下代碼展示如何簡單列舉對象版本:
public function ListObjectVersions(){
$versions = $this->s3Client->listObjectVersions([
'Bucket' => '<your-bucket-name>'
])->search('Versions');
foreach ($versions as $version){
echo "Key: " . $version['Key'] . "\n";
echo "VersionId: " . $version['VersionId'] . "\n";
}
}如果 list 大于1000,則可以使用 Paginator 接口列舉所有對象版本。列舉所有對象版本示例代碼如下:
public function ListObjectVersions2(){
$versions = $this->s3Client->getPaginator('ListObjectVersions', [
'Bucket' => '<your-bucket-name>'
])->search('Versions');
foreach ($versions as $version){
echo "Key: " . $version['Key'] . "\n";
echo "VersionId: " . $version['VersionId'] . "\n";
}
}請求參數
| 參數 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| Bucket | string | 設置桶名稱 | 是 |
返回結果
| 屬性名 | 類型 | 說明 |
|---|---|---|
| Versions | version array | 返回的對象版本數組,包含對象名,版本id,最后修改時間,ETag等信息 |