對象存儲 PHP SDK
安裝
SDK
GitHub 地址: https://github.com/NetEase-Object-Storage/nos-php-sdk
ChangLog: https://github.com/NetEase-Object-Storage/nos-php-sdk/blob/master/README.md
曆史版本: 無
環境要求
php5.3+ 使用以下命令顯示當前的 php 版本:
php -v
cURL 擴展 使用以下命令查看 curl 擴展是否已經安裝好:
php -m
Windows下用戶,請參考 Windows下使用NOS PHP SDK
安裝
composer方式
如果您通過 composer 管理您的項目依賴,可以在你的項目根目錄運行:
composer require netease/nos-php-sdk
或者在你的 composer.json 中聲明對 NOS SDK for PHP 的依賴:
"require": { "netease/nos-php-sdk": "1.0.0" }
然後通過 conposer install 安裝依賴,安裝完成後形成如下目錄結構:
. ├── app.php ├── composer.json ├── composer.lock └── vendor
其中 app.php 是用戶的應用程序,vendor/ 目錄下包含了所依賴的庫,用戶需要在 app.php 中引入如下依賴:
require_once __DIR__ . '/vendor/autoload.php';
1. 如果項目中已經引用過 autoload.php,則加入了 sdk 依賴之後,不需要再引入 autoload.php 了
2. 如果使用 composer 出現網絡錯誤,可以使用 composer 中國區的鏡像源,方法是在命令行執行: composer config -g repositories.packagist composer https://packagist.phpcomposer.com
phar 方式
使用 phar 單文件方式,可以在以下 鏈接,下載已經打好包的 phar 文件,或者根據源文件自行編譯,然後在你的源代碼中引入 phar 文件:
require_once '/path/to/nos-sdk-php.phar';
源碼方式
使用 SDK 源碼,在發布頁麵,選擇相應的版本,下載打好包的 zip 文件,解壓後的根目錄中包含一個 autoload.php 文件,在您的代碼中引入這個文件:require_once '/path/to/nos-sdk/autoload.php';
運行 Samples
- 解壓下載到的 sdk 包
- 修改samples目錄中的 Config.php 文件
1. 修改 NOS_ACCESS_ID, 您從 NOS 獲得的AccessKeyId
2. 修改 NOS_ACCESS_KEY, 您從 NOS 獲得的AccessKeySecret
3. 修改 NOS_ENDPOINT, 您選定的 NOS 數據中心訪問域名,例如: nos-eastchina1.126.net
4. 修改 NOS_TEST_BUCKET, 您要用來運行 sample 使用的 bucket,sample 程序會在這個bucket中創建一些文件,注意不能用生產環境的 bucket,以 免汙染用戶數據
- 到 samples 目錄中執行 php RunAll.php, 也可以單個運行某個 Sample 文件
初始化
確定 EndPoint
EndPoint 是 NOS 各個區域的地址,目前支持以下形式
EndPoint 類型 | 備注 |
---|---|
NOS區域域名地址 | 使用桶所在的區域的NOS域名地址 |
NOS 區域域名地址
進入 NOS 控製台,在桶的屬性中可以查找到當前桶所在的區域及域名,桶的域名的後綴部分為 該桶的公網域名,例如: test-logging.nos-eastchina1.126.net 中的 nos-eastchina1.126.net 為該桶的公網 EndPoint 。
配置秘鑰
要接入 NOS 服務,您需要一對有效的 AccessKey(包括 AccessKeyId 與 AccessKeySecret)來進行 簽名驗證,開通服務與 AccessKey 請參考 訪問控製
在獲取到 AccessKeyId 與 AccessKeySecret 之後,可以按照以下的步驟進行初始化
新建 NosClient
使用 NOS 地區域名創建 NosClient
初始化代碼如下所示:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); } catch(NosException e){ print e->getMessage(); }
設置網絡參數
我們可以通過 Client 設置一些基本的網絡參數:
<?php $nosClient->setTimeout(3600 /* seconds */); $nosClient->setConnectTimeout(10 /* seconds */);
其中:
- setTimeout 設置請求超時時間,單位秒,默認是 5184000 秒, 這裏建議不要設置太小,如果上傳文件很大,消耗的時間會比較長
- setConnectTimeout 設置連接超時時間,單位秒,默認是10秒
快速入門
請確認您已經熟悉 NOS 的基本概念,如 Bucket、Object 、EndPoint 、AccessKeyId 和 AccessKeySecret 等。 本節您將看到如何快速的使用 NOS PHP SDK ,完成常用的操作,創建桶、上傳文件、下載文件等。
常用類
常用類 | 備注 |
---|---|
NOSNosClient | NOS 客戶端類,用戶通過NosClient調用服務 |
NOSCoreNosException | NOS異常,在調用過程中去捕獲這個異常,查看失敗原因 |
基本操作
創建桶
您可以使用以下代碼新建一個桶:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; $bucket = "使用的桶名,注意命名規則"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); $nosClient->createBucket($bucket); } catch(NosException e){ print e->getMessage(); }
Attention:
桶名命名規則請參見 API 手冊桶命名規範
更多的關於bucket的操作的信息,請參見 NOS-PHP-SDK Bucket管理
上傳文件
對象(Object)是 NOS 中最基本的數據單元,您可以把它簡單的理解為文件,以下代碼可以實現簡單的對象上傳:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; $bucket = "使用的桶名,注意命名規則"; $object = "使用的對象名,注意命名規則"; $content = "Hello NOS!"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); $nosClient->putObject($bucket,$object,$content); } catch(NosException e){ print e->getMessage(); }
Attention: 對象命名規則請參見 API 手冊 對象
更多的上傳文件信息,請參見 NOS-PHP-SDK 上傳文件
下載文件
上傳對象成功之後,您可以讀取它的內容,以下代碼可以實現文件的下載:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; $bucket = "使用的桶名,注意命名規則"; $object = "使用的對象名,注意命名規則"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); $content = $nosClient->getObject($bucket,$object); print("object content: " . $content); } catch(NosException e){ print e->getMessage(); }
列舉文件
當上傳文件成功之後,可以查看桶中包含的文件列表,以下代碼展示如何列舉桶內的文件:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; $bucket = "使用的桶名,注意命名規則"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); $listObjectInfo = $nosClient->listObjects($bucket); if (!empty($objectList)) { foreach ($objectList as $objectInfo) { print($objectInfo->getKey() . "\t" . $objectInfo->getSize() . "\t" . $objectInfo->getLastModified() . "\n"); } } } catch(NosException e){ print e->getMessage(); }
Note;
上麵的代碼默認列舉100個object
更多的管理文件信息,請參見NOS-PHP-SDK 文件管理
刪除文件
文件上傳成功後,可以指定刪除桶中的文件,以下代碼實現桶中文件的刪除:
<?php use NOS\NosClient; use NOS\Core\NosException; $accessKeyId = "您的accessKeyId"; $accessKeySecret = "您的accessKeySecret"; $endPoint = "建桶時選擇的的區域域名"; $bucket = "使用的桶名,注意命名規則"; $object = "使用的對象名,注意命名規則"; try{ $nosClient = new NosClient($accessKeyId,$accessKeySecret,$endPoint); $content = $nosClient->deleteObject($bucket,$object); } catch(NosException e){ print e->getMessage(); }
返回結果處理
NosClient中的接口對應返回數據分為兩類:
- Put,Delete 類接口返回 null,如果沒有 NosException,即可認為操作成功
- Get,List 類接口返回對應的數據,如果沒有 NosException,即可認為操作成功
例如:
<?php $bucketListInfo = $nosClient->listBuckets(); $bucketList = $bucketListInfo->getBucketList(); foreach($bucketList as $bucket) { print($bucket->getLocation() . "\t" . $bucket->getName() . "\t" . $bucket->getCreatedate() . "\n"); }
上麵代碼中的 $bucketListInfo 的數據類型是 NOS\Model\BucketListInfo
桶的管理
桶是 NOS 上的存儲空間,也是計費、權限控製、日誌記錄等高級功能的管理實體。
新建桶
您可以使用 NosClient::createBucket 新建桶:
<?php /** * 創建一個桶 * acl 指的是bucket的訪問控製權限,有兩種,私有讀寫,公共讀私有寫。 * 私有讀寫就是隻有bucket的擁有者或授權用戶才有權限操作 * 公共讀私有寫,任意用戶可以讀,隻有授權用戶才能寫 * 兩種權限分別對應NosClient::NOS_ACL_TYPE_PRIVATE, * NosClient::NOS_ACL_TYPE_PUBLIC_READ, * * @param NosClient $nosClient NosClient實例 * @param string $bucket 要創建的bucket名字 * @return null */ function createBucket($nosClient, $bucket) { try { $nosClient->createBucket($bucket, NosClient::NOS_ACL_TYPE_PRIVATE); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 桶的命名規範,請參見 基本概念 桶命名規範
2. 桶的名字全局唯一,不同用戶之間的桶名也不能重複
3. 關於權限更加詳細的說明,請參見: 桶的屬性
判斷桶是否存在
您可以使用 NosClient::doesBucketExist 判斷桶是否存在:
<?php /** * 判斷Bucket是否存在 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 桶名稱 */ function doesBucketExist($nosClient, $bucket) { try { $res = $nosClient->doesBucketExist($bucket); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } if ($res === true) { print(__FUNCTION__ . ": OK" . "\n"); } else { print(__FUNCTION__ . ": FAILED" . "\n"); } }
列出用戶所有的桶
您可以使用 NosClient::listBuckets 列出當前用戶所有的桶:
<?php /** * 列出用戶所有的Bucket * * @param NosClient $nosClient NosClient實例 * @return null */ function listBuckets($nosClient) { $bucketList = null; try{ $bucketListInfo = $nosClient->listBuckets(); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } $bucketList = $bucketListInfo->getBucketList(); foreach($bucketList as $bucket) { print($bucket->getName() . "\t" . $bucket->getCreatedate() . "\n"); } }
刪除桶
您可以使用NosClient::deleteBucket 刪除空桶:
<?php /** * 刪除存儲空間 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 待刪除的桶名稱 * @return null */ function deleteBucket($nosClient, $bucket) { try{ $nosClient->deleteBucket($bucket); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 如果存儲空間不為空(存儲空間中有文件或者分片上傳的分片),則存儲空間無法刪除;
2. 必須先刪除存儲空間中的所有文件和分片後,存儲空間才能成功刪除。
設置桶的ACL屬性
除了在創建桶的時候可以指定桶的ACL屬性之外,也可以根據自己的業務需求對桶的ACL進行修改,這個操作隻有桶的擁有者有權限修改,關於桶的權限修改請參考: 桶的屬性修改
桶存在兩種權限:
權限 | 備注 |
---|---|
私有讀寫 | NosClient::NOS_ACL_TYPE_PRIVATE |
公共讀私有寫 | NosClient::NOS_ACL_TYPE_PUBLIC_READ |
您可以使用 NosClient::putBucketAcl 設置桶的訪問權限:
<?php /** * 設置bucket的acl配置 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 桶名稱 * @return null */ function putBucketAcl($nosClient, $bucket) { $acl = NosClient::NOS_ACL_TYPE_PRIVATE; try { $nosClient->putBucketAcl($bucket, $acl); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
獲取桶的ACL屬性
您可以使用 NosClient::getBucketAcl 獲取桶的訪問權限:
<?php /** * 獲取bucket的acl配置 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 桶名稱 * @return null */ function getBucketAcl($nosClient, $bucket) { try { $res = $nosClient->getBucketAcl($bucket); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); print('acl: ' . $res); }
獲取桶所處的分區
您可以使用 NosClient::getBucketLocation 獲取桶所處的分區:
<?php /** * 獲取bucket的location配置 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 桶名稱 * @return null */ function getBucketAcl($nosClient, $bucket) { try { $res = $nosClient->getLocation($bucket); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); print('location: ' . $res); }
文件上傳
在 NOS 中用戶的基本操作單元是對象,亦可以理解為文件,NOS PHP SDK提供了豐富的上傳接口,可以通過以下的方式上傳文件:
- 字符串上傳
- 本地文件上傳
- 分片上傳
字符串上傳、本地文件上傳最大為100M,分片上傳沒有限製
字符串上傳
您可以使用 NosClient::putObject 上傳字符串內容到文件中,具體實現如下:
<?php /** * 上傳字符串作為object的內容 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function putObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; $content = file_get_contents(__FILE__); try{ $nosClient->putObject($bucket, $object, $content); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
本地文件上傳
您可以使用 NosClient::uploadFile 上傳文件內容,具體實現如下:
<?php /** * 上傳指定的本地文件內容 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function uploadFile($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; $filePath = __FILE__; try{ $nosClient->uploadFile($bucket, $object, $filePath); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 上傳的文件內容不超過100M
分片上傳
除了通過putObject接口上傳文件到NOS之外,NOS還提供了另外一種上傳模式-分片上傳,用戶可以在如下應用場景內(但不限於此),使用分片上傳模式,如:
- 需支持斷點上傳
- 上傳超過100M的文件
- 網絡條件較差,經常和NOS服務器斷開連接
- 上傳文件之前無法確定文件的大小
分片上傳本地文件
您可以使用 NosClient::multiuploadFile 來上傳一個文件,該方法封裝了細節,會根據傳入的文件及分片的大小自動選擇上傳方式,對於分片大小小於文件大下的情況下會使用分片上傳:
<?php /** * 通過multipart上傳文件 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function multiuploadFile($nosClient, $bucket) { $object = "test/multipart-test.txt"; $file = __FILE__; try{ $nosClient->multiuploadFile($bucket, $object, $file); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 默認的分片大小為5M
原始接口分片上傳
您可以使用原始的分片上傳接口進行分片上傳,一般流程如下所示:
- 初始化一個分片上傳任務(InitiateMultipartUpload)
- 逐個或並行上傳分片(UploadPart)
- 完成分片上傳(CompleteMultipartUpload)或者取消分片上傳(AbortMultipartUpload)
下麵通過一個完整的示例說明了如何通過原始的api接口一步一步的進行分片上傳操作,如果用戶需要做斷點續傳等高級操作,可以參考下麵代碼:
<?php /** * 使用基本的api分階段進行分片上傳 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @throws NosException */ function putObjectByRawApis($nosClient, $bucket) { $object = "test/multipart-test.txt"; /** * step 1. 初始化一個分塊上傳事件, 也就是初始化上傳Multipart, 獲取upload id */ try{ $uploadId = $nosClient->initiateMultipartUpload($bucket, $object); } catch(NosException $e) { printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n"); /* * step 2. 上傳分片 */ // 分片大小10M $partSize = 10 * 1024 * 1024; $uploadFile = __FILE__; $uploadFileSize = filesize($uploadFile); $pieces = $nosClient->generateMultiuploadParts($uploadFileSize, $partSize); $responseUploadPart = array(); $uploadPosition = 0; $isCheckMd5 = true; foreach ($pieces as $i => $piece) { $fromPos = $uploadPosition + (integer)$piece[NosClient::NOS_SEEK_TO]; $toPos = (integer)$piece[NosClient::NOS_LENGTH] + $fromPos - 1; $upOptions = array( $nosClient::NOS_FILE_UPLOAD => $uploadFile, $nosClient::NOS_PART_NUM => ($i + 1), $nosClient::NOS_SEEK_TO => $fromPos, $nosClient::NOS_LENGTH => $toPos - $fromPos + 1, $nosClient::NOS_CHECK_MD5 => $isCheckMd5, ); if ($isCheckMd5) { $contentMd5 = NosUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos); $upOptions[$nosClient::NOS_CONTENT_MD5] = $contentMd5; } //2. 將每一分片上傳到 NOS try { $responseUploadPart[] = $nosClient->uploadPart($bucket, $object, $uploadId, $upOptions); } catch(NosException $e) { printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n"); printf($e->getMessage() . "\n"); return; } printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n"); } $uploadParts = array(); foreach ($responseUploadPart as $i => $eTag) { $uploadParts[] = array( 'PartNumber' => ($i + 1), 'ETag' => $eTag, ); } /** * step 3. 完成上傳 */ try { $nosClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts); } catch(NosException $e) { printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n"); printf($e->getMessage() . "\n"); return; } printf(__FUNCTION__ . ": completeMultipartUpload OK\n"); }
Attention:
1. 上麵程序一共分為三個步驟:1. initiate 2. uploadPart 3. complete2. UploadPart 方法要求除最後一個Part以外,其他的Part大小都要大於或等於5M。但是Upload Part接口並不會立即校驗上傳Part的大小(因為不知道是否為最後一塊);隻有當Complete Multipart Upload的時候才會校驗。
3. Part號碼的範圍是1~10000。如果超出這個範圍,NOS 將返回InvalidArgument的錯誤碼。
4. 每次上傳Part時都要把流定位到此次上傳塊開頭所對應的位置。
5. 分片上傳任務初始化或上傳部分分片後,可以使用abortMultipartUpload接口中止分片上傳事件。當分片上傳事件被中止後,就不能再使用這個Upload ID做任何操作,已經上傳的分片數據也會被刪除。
6. 每次上傳Part之後,NOS 的返回結果會包含一個 PartETag 對象,它是上傳塊的ETag與塊編號(PartNumber)的組合。在後續完成分片上傳的步驟中會用到它,因此我們需要將其保存起來,然後在第三步complete的時候使用,具體操作參考上麵代碼。
查看已經上傳的分片
查看已經上傳的分片可以羅列出指定 Upload ID ( InitiateMultipartUpload 時獲取)所屬的所有已經上傳成功的分片,您可以通過 NosClient::listParts 接口獲取已經上傳的分片,可以參考以下代碼:
/** * 查看已上傳的分片 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @param string $uploadId upload Id * @return null */ function listParts($nosClient, $bucket, $uploadId) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $options = array(); $options['max-parts'] = 100; $optiosn['part-number-marker'] = '10'; $listPartsInfo = $nosClient->listParts($bucket, $object, $upload_id,$options); foreach ($listPartsInfo->getListPart() as $partInfo) { print($partInfo->getPartNumber() . "\t" . $partInfo->getSize() . "\t" . $partInfo->getETag() . "\t" . $partInfo->getLastModified() . "\n"); } } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
查看已經上傳的分片可以指定以下參數:
參數 | 描述 |
---|---|
max-parts | 響應中的limit個數 類型:整型 |
part-number-marker | 分塊號的界限,隻有更大的分塊號會被列出來。 類型:字符串 |
查看當前正在進行的分片上傳任務
查看正在進行的分片上傳任務可以羅列出正在進行,還未完成的分片上傳任務,您可以通過 NosClient::listMultipartUploads 接口當前的上傳任務,可以參考以下代碼:
<?php /** * 獲取當前未完成的分片上傳列表 * * @param $nosClient NosClient * @param $bucket string */ function listMultipartUploads($nosClient, $bucket) { $options = array( 'max-uploads' => 100, 'key-marker' => '' ); try { $listMultipartUploadInfo = $nosClient->listMultipartUploads($bucket, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": listMultipartUploads FAILED\n"); printf($e->getMessage() . "\n"); return; } printf(__FUNCTION__ . ": listMultipartUploads OK\n"); $listUploadInfo = $listMultipartUploadInfo->getUploads(); var_dump($listUploadInfo); }
上述代碼中使用的options參數如下:
參數值 | 描述 |
---|---|
key-marker | 指定某一uploads key,隻有大於該key-marker的才會被列出 |
max-uploads | 最多返回max-uploads條記錄,默認1000 |
設置文件元信息
文件元數據( object meta ),是上傳到 NOS 的文件屬性描述信息:分為 http 標準屬性和用戶自定義元數據。文件元信息可以在各種上傳方式(字符串上傳、文件上傳、分片上傳)或 copy 文件時進行設置,元數據大小寫不敏感。
設定http header NOS 允許用戶自定義http Header。http header相關信息請參考 RFC2616,幾個常用的header說明如下:
名稱 | 描述 |
---|---|
Content-MD5 | 文件數據校驗,設置了該值後 NOS 會啟用文件內容MD5校驗,把您提供的MD5與文件的MD5比較,不一致會拋出錯誤 |
Content-Type | 文件的MIME,定義文件的類型及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取文件。如果用戶沒有指定則根據Key或文件名的擴展名生成,如果沒有擴展名則填默認值 |
Content-Disposition | 指示MINME用戶代理如何顯示附加的文件,打開或下載,及文件名稱 |
Content-Length | 上傳的文件的長度,超過流/文件的長度會截斷,不足為實際值 |
Expires | 緩存過期時間,NOS 未使用,格式是格林威治時間(GMT) |
Cache-Control | 指定該Object被下載時的網頁的緩存行為 |
下麵的源代碼實現了上傳文件時設置Http header:
/** * 上傳時設置文件的元數據 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function putObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; $content = file_get_contents(__FILE__); $options = array( NosClient::NOS_HEADERS => array( 'Expires' => '2016-12-12 08:00:00', 'Content-Disposition' => 'attachment; filename="xxxxxx"', )); try{ $nosClient->putObject($bucket, $object, $content, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
用戶自定義元數據
NOS 支持用戶自定義對象元數據,上傳時可以指定對象自定義元數據,數據放在http頭中傳輸,以 x-nos-meta-開頭,以下源代碼實現對象自定義元數據上傳:
<?php /** * 上傳時設置文件的自定義元數據 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function putObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; $content = file_get_contents(__FILE__); $options = array(NosClient::NOS_HEADERS => array( 'x-nos-meta-self-define-title' => 'user define meta info', )); try{ $nosClient->putObject($bucket, $object, $content, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
上傳時校驗MD5
為了確保 PHP SDK 發送的數 NOS 服務端接收到的數據一致,NOS 支持MD5校驗。文件上傳時(字符串上傳、文件上傳、分片上傳)默認關閉 MD5,如果您需要打開 MD5 校驗,請上傳文件的 options 設置。
下麵的代碼實現了上傳時開啟 MD5 校驗:
<?php /** * 上傳時開啟MD5校驗 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function putObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; $options = array(NosClient::NOS_CHECK_MD5 => true); try{ $nosClient->uploadFile($bucket, $object, __FILE__, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 校驗MD5會有一定的性能損失;
文件下載
NOS PHP SDK 提供了豐富的文件下載接口,用戶可以通過以下方式從 NOS 獲取文件:
- 下載文件到內存
- 下載到本地文件
- 分段下載
- 條件下載
下載文件到內存
以下源代碼實現下載文件到內存中:
<?php /** * 獲取object的內容 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 桶名稱 * @return null */ function getObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $content = $nosClient->getObject($bucket, $object); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
下載文件到本地文件
<?php /** * get_object_to_local_file * * 獲取object * 將object下載到指定的文件 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function getObjectToLocalFile($nosClient, $bucket) { $object = "nos-php-sdk-test/download-test-object-name.txt"; $localfile = "download-test-object-name.txt"; $options = array( NosClient::NOS_FILE_DOWNLOAD => $localfile, ); try{ $nosClient->getObject($bucket, $object, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK, please check localfile: 'upload-test-object-name.txt'" . "\n"); }
範圍下載
如果存儲在NOS中的文件較大,並且您隻需要其中的一部分內容,您可以使用範圍下載,下載指定範圍的數據,如果指定的下載範圍為”0-100”,則返回結果為第0字節到第100字節的數據,返回的數據包含第100字節,即[0,100],如果指定的範圍無效則下載整個文件,以下源代碼獲取[0,100]字節的內容:
<?php /** * 獲取object的內容 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function getObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $options = array(NosClient::NOS_RANGE => '0-100'); $content = $nosClient->getObject($bucket, $object, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 下載內容也可以存儲到文件中 2. 注意下載的區間為閉區間
條件下載
下載文件時,可以指定限定條件,滿足限定條件時下載,不滿足時報錯,不下載文件。可以使用的限定條件如下:
參數 | 說明 | NosClient對應值 |
---|---|---|
If-Modified-Since | 如果指定的時間早於實際修改時間,則正常傳送。否則返回錯誤 | NosClient::NOS_IF_MODIFIED_SINCE |
<?php /** * 如果文件在指定的時間之後修改過,則下載文件 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function getObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $options = array( NosClient::NOS_HEADERS => array( NosClient::NOS_IF_MODIFIED_SINCE => "Fri, 13 Nov 2016 14:47:53 GMT"), ); $content = $nosClient->getObject($bucket, $object, $options); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 下載內容也可以存儲到文件中
文件管理
在NOS中,用戶可以通過一係列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。
列出桶中的文件
您可以使用NosClient::listObjects列出存儲中間中的文件:
<?php /** * 列出Bucket內所有目錄和文件, 根據返回的nextMarker循環調用listObjects接口得到所有文件 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function listAllObjects($nosClient, $bucket) { for ($i = 0; $i < 100; $i += 1) { $nosClient->putObject($bucket, "dir/obj" . strval($i), "hi"); } $prefix = 'dir/'; $delimiter = '/'; $nextMarker = ''; $maxkeys = 30; while (true) { $options = array( 'delimiter' => $delimiter, 'prefix' => $prefix, 'max-keys' => $maxkeys, 'marker' => $nextMarker, ); var_dump($options); try { $listObjectInfo = $nosClient->listObjects($bucket, $options); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } var_dump($listObjectInfo); // 得到nextMarker,從上一次listObjects讀到的最後一個文件的下一個文件開始繼續獲取文件列表 $nextMarker = $listObjectInfo->getNextMarker(); $listObject = $listObjectInfo->getObjectList(); var_dump($listObject); if ($nextMarker === '') { break; } } }
上述代碼中的$options中的參數如下所示:
參數 | 說明 |
---|---|
delimiter | 用於對Object名字進行分組的字符。所有名字包含指定的前綴且第一次出現delimiter字符之間的object作為一組元素 |
prefix | 限定返回的object key必須以prefix作為前綴。注意使用prefix查詢時,返回的key中仍會包含prefix |
max-keys | 限定此次返回object的最大數,如果不設定,默認為100 |
marker | 設定結果從marker之後按字母排序的第一個開始返回 |
Note:
上述表中的參數都是可選參數
判斷文件是否存在
您可以使用NosClient::doesObjectExist判斷文件是否存在:
<?php /** * 判斷object是否存在 * * @param NosClient $nosClient NosClient實例 * @param string $bucket bucket名字 * @return null */ function doesObjectExist($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $exist = $nosClient->doesObjectExist($bucket, $object); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); var_dump($exist); }
刪除單個文件
您可以使用NosClient::deleteObject刪除單個需要刪除的文件:
<?php /** * 刪除object * * @param NosClient $nosClient NosClient實例 * @param string $bucket bucket名字 * @return null */ function deleteObject($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try{ $nosClient->deleteObject($bucket, $object); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
刪除多個文件
您可以使用NosClient::deleteObjects批量刪除文件:
<?php /** * 批量刪除object * * @param NosClient $nosClient NosClient實例 * @param string $bucket bucket名字 * @return null */ function deleteObjects($nosClient, $bucket) { $objects = array(); $objects[] = "nos-php-sdk-test/upload-test-object-name.txt"; $objects[] = "nos-php-sdk-test/upload-test-object-name.txt.copy"; try{ $nosClient->deleteObjects($bucket, $objects); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
拷貝文件
您可以使用NosClient::copyObject拷貝文件:
<?php /** * 拷貝object * * @param NosClient $nosClient NosClient實例 * @param string $bucket bucket名字 * @return null */ function copyObject($nosClient, $bucket) { $from_bucket = $bucket; $from_object = "nos-php-sdk-test/upload-test-object-name.txt"; $to_bucket = $bucket; $to_object = $from_object . '.copy'; try{ $nosClient->copyObject($from_bucket, $from_object, $to_bucket, $to_object); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 支持跨桶的文件copy
移動文件
您可以使用NosClient::moveObject移動文件:
<?php /** * 移動Object * * @param NosClient $nosClient NosClient實例 * @param string $bucket bucket名字 * @return null */ function copyObject($nosClient, $bucket) { $from_bucket = $bucket; $from_object = "nos-php-sdk-test/upload-test-object-name.txt"; $to_bucket = $bucket; $to_object = $from_object . '.move'; try{ $nosClient->moveObject($from_bucket, $from_object, $to_bucket, $to_object); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); }
Attention:
1. 暫時不支持跨桶的文件move
修改文件元信息
暫時不提供此類方法
獲取文件的文件元信息
您可以使用NosClient::getObjectMeta獲取對象的元數據信息:
<?php /** * 獲取object meta, 也就是getObjectMeta接口 * * @param NosClient $nosClient NosClient實例 * @param string $bucket 存儲空間名稱 * @return null */ function getObjectMeta($nosClient, $bucket) { $object = "nos-php-sdk-test/upload-test-object-name.txt"; try { $objectMeta = $nosClient->getObjectMeta($bucket, $object); } catch (NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": OK" . "\n"); if (isset($objectMeta[strtolower('Content-Disposition')]) && 'attachment; filename="xxxxxx"' === $objectMeta[strtolower('Content-Disposition')] ) { print(__FUNCTION__ . ": ObjectMeta checked OK" . "\n"); } else { print(__FUNCTION__ . ": ObjectMeta checked FAILED" . "\n"); } }
Attention:
1. 獲取的元數據通過一個array返回,返回值為HTTP頭類型的元數據與用戶自定義元數據 2. 元數據名的大小均為小寫
授權訪問
通過生成簽名URL的形式提供給用戶一個臨時的訪問URL。在生成URL時,您可以指定URL過期的時間,從而限製用戶長時間訪問。
生成私有下載鏈接 生成 GetObject 的簽名 url 示例如下:
<?php /** * 生成GetObject的簽名url,主要用於私有權限下的讀訪問控製 * * @param $nosClient NosClient NosClient實例 * @param $bucket string bucket名稱 * @return null */ function getSignedUrlForGettingObject($nosClient, $bucket) { $object = "test/test-signature-test-upload-and-download.txt"; $timeout = 3600; // URL的有效期是3600秒 try{ $signedUrl = $nosClient->signUrl($bucket, $object, $timeout); } catch(NosException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } print(__FUNCTION__ . ": signedUrl: " . $signedUrl. "\n"); /** * 可以類似的代碼來訪問簽名的URL,也可以輸入到瀏覽器中去訪問 */ $request = new RequestCore($signedUrl); $request->set_method('GET'); $request->send_request(); $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code()); if ($res->isOK()) { print(__FUNCTION__ . ": OK" . "\n"); } else { print(__FUNCTION__ . ": FAILED" . "\n"); }; }
最後更新:2017-01-03 10:48:53