最近項目移到雲服務器,因此須要處理一下php
Step 1. 初始化OSSClient SDK與OSS後臺服務全部的交互都是經過OSSClient完成的。經過如下代碼,能夠生成OSSClient的實例: <?php require_once '/path/to/sdk/aliyun.php'; use \Aliyun\OSS\OSSClient; $client = OSSClient::factory(array( 'AccessKeyId' => '<access-key-id>', 'AccessKeySecret' => '<access-key-secret>', )); 因爲SDK使用了命名空間機制,須要在文件開始聲明使用 \Aliyun\OSS\OSSClient 類。 OSSClient使用工廠方法構建了一個OSSClient實例,此方法接收一個array做爲輸入參數;array中的 AccessKeyId 和 AccessKeySecret 是由系統分配給用戶的ID對,用於標識用戶,爲訪問OSS作簽名驗證。 咱們看到,上面的例子經過在array中設置 key-value 對來傳遞參數。以後要介紹的大部分SDK接口也是經過這種形式來使用的。 Step 2. 建立Bucket 你能夠經過如下代碼來建立Bucket: <?php $client->createBucket(array( 'Bucket' => 'your-bucket-name', )); 經過指定 Bucket 參數來制定Bucket的名字,Bucket的名稱有全局惟一性,請儘可能保證你的Bucket名稱不與別人的重複。 關於Bucket的命名規範,參見 Bucket命名規範 。 Step 3. 上傳Object Object能夠簡單的理解成一個文件,你能夠經過如下代碼把Object上傳到一個Bucket中: <?php $client->putObject(array( 'Bucket' => 'your-bucket-name', 'Key' => 'your-object-key', 'Content' => 'This is my content', )); 咱們經過 Bucket 和 Key 來指定Object所在的Bucket以及Object的名字。 Content 爲Object的實際內容,它能夠爲字符串或者是資源類型(resource),當 Content 類型爲resource時,你必須指定Object的大小(以字節爲單位)。 好比: <?php $client->putObject(array( 'Bucket' => 'your-bucket-name', 'Key' => 'your-object-key', 'Content' => fopen('/path/to/file', 'r'), 'ContentLength' => filesize('/path/to/file'), )); 關於Object的命名規範,參見 Object命名規範 。 關於上傳Object更詳細的信息,參見 上傳Object 。 Step 4. 獲取Object列表 你可能想知道在一個Bucket中存的Object是什麼,經過 listObjects 接口能夠達到這一目的: <?php $objectListing = $client->listObjects(array( 'Bucket' => 'your-bucket-name', )); foreach ($objectListing->getObjectSummarys() as $objectSummary) { echo $objectSummary->getKey(); } listObjects 接口會返回 \Aliyun\OSS\Model\ObjectListing 對象,你能夠經過對象的 getObjectSummarys 方法獲取Object的列表。 Step 5. 下載Object 經過下面代碼咱們能夠獲取一個已經上傳了的Object的內容: <?php $object = $client->getObject(array( 'Bucket' => 'your-bucket-name', 'Key' => 'your-object-key', )); echo (string)$object; 事實上,getObject 方法返回了一個 \Aliyun\OSS\Model\OSSObject 的對象,此對象包含了Object的一些信息,以及一個能夠用來讀取object內容的resource類型的成員。 <?php $object = $client->getObject(array( 'Bucket' => 'your-bucket-name', 'Key' => 'your-object-key', )); echo "Key: " . $object->getKey() . "\n"; echo "Update Date: " . $object->getLastModified()->getTimestamp() . "\n"; echo "Content: \n"; echo stream_get_contents($object->getObjectContent()); // Print object's content. Step 6. 處理異常 當咱們執行一些錯誤的操做,好比試圖獲取一個不存在的bucket的Object列表的時候,SDK會拋出類型爲 \Aliyun\OSS\Exceptions\OSSException 的異常;另外,因爲網絡錯誤等緣由,client也有可能拋出 \Aliyun\Common\Exceptions\ClientException 異常。你能夠catch這些異常: <?php try { $client->listObjects(array( 'Bucket' => 'bucket-non-exist', )); } catch (\Aliyun\OSS\Exceptions\OSSException $ex) { echo "Error: " . $ex->getErrorCode() . "\n"; } catch (\Aliyun\Common\Exceptions\ClientException $ex) { echo "ClientError: " . $ex->getMessage() . "\n"; } 爲了更簡明地闡述SDK的使用,本文檔的大多數實例代碼都沒有對異常進行處理。可是,在實際的開發中,爲了實現程序的健壯性,你都應該捕獲這些異常並處理它們。
一個實際的api
public function zz() { if (IS_POST) { P($_FILES); foreach ($_FILES as $value) { foreach ($value["error"] as $k => $v) { if ($v == 1) { echo $err = $value['name'][$k] . '超過了php.ini的upload_max_filesize最大上傳文件大小'; // return false; } elseif ($v == 2) { echo $err = $value['name'][$k] . '超過了瀏覽器表單的最大上傳文件大小'; // return false; } elseif ($v == 3) { echo $err = $value['name'][$k] . '上傳的文件僅部分上傳'; // return false; } elseif ($v == 4) { echo $err = $value['name'][$k] . '沒有上傳文件'; // return false; } elseif ($v == 6) { echo $err = $value['name'][$k] . '缺乏系統臨時文件夾或者無寫入權限'; // return false; } elseif ($v == 7) { echo $err = $value['name'][$k] . '系統錯誤,寫入磁盤失敗'; // return false; } elseif ($v == 8) { echo $err = $value['name'][$k] . 'PHP擴展程序中止文件上傳'; // return false; } } } // 處理文件數組 $bucketName = Common::getBucketName(); $ossClient = Common::getOssClient(); if (is_null($ossClient)) { $err = 'oss對象獲取失敗!'; return false; } $upload_root = C('SERVERFILE_ROOT'); $category = 'zx'; $folder = "/{$category}/" . date('Ym/d', time()); echo $upload_folder = $upload_root . $folder; $objectListing = $ossClient->createObjectDir($bucketName, $upload_folder); //建立目錄,防止時間24點出現目錄錯誤
upload_folder 注意要爲 'zx/tt/ll',先後不要有/否則會出錯
if ($objectListing['info']['http_code'] != 200) { myLog($objectListing, 'oss_log'); echo $err = '文件建立失敗'; } $filename = array(); foreach ($_FILES as $value) { foreach ($value['tmp_name'] as $k => $v) { $filename[$k]['name'] = $value['name'][$k]; $filename[$k]['local_path'] = $value['tmp_name'][$k]; $filename[$k]['folder'] = $upload_folder; $filename[$k]['size'] = $value['size'][$k]; $filename[$k]['type'] = $value['type'][$k]; $des_name_suffix = substr(strrchr($value['name'][$k], '.'), 1); $des_name = microtime_format('YmdHisx', microtime(true)) . rand(100, 999) . rand(10, 99); $filename[$k]['file_name'] = $des_name . '.' . $des_name_suffix; $filename[$k]['extension'] = $des_name_suffix; $filename[$k]['destination_name'] = $bucketName . $filename[$k]['folder'] . $des_name . '.' . $des_name_suffix; //存儲在OSS裏面最後的名字 } } $return_array = array(); foreach ($filename as $kk => $vv) { $return = $ossClient->uploadFile($bucketName, ($upload_folder . '/' . $vv['file_name']), $vv['local_path']);
($upload_folder . '/' . $vv['file_name'])注意這個目錄必定要是 'zx/tt/ll',先後不要有/否則會出錯
if ($return['info']['http_code'] == 200) { $return_array[$kk]['savename'] = $vv['file_name']; $return_array[$kk]['type'] = $vv['type']; $return_array[$kk]['size'] = $vv['size']; $return_array[$kk]['extension'] = $vv['extension']; $return_array[$kk]['savepath'] = '/' . $upload_folder . $vv['file_name']; $return_array[$kk]['hash'] = $return['content-md5']; $return_array[$kk]['oss_url'] = $return['info']['url']; } else { myLog($return, 'api_log'); $err = 'HTTP頭部信息返回錯誤!'; } } P($filename); P($return_array); } $this->display(); }
實例demo 請入羣下載數組