1. 程式人生 > >阿裏OSS存儲,php版demo

阿裏OSS存儲,php版demo

異常 阿裏 amp spa this create str cti obj

最近項目移到雲服務器,所以需要處理一下

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的使用,本文檔的大多數實例代碼都沒有對異常進行處理。但是,在實際的開發中,為了實現程序的健壯性,你都應該捕獲這些異常並處理它們。

一個實際的

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 請入群下載

阿裏OSS存儲,php版demo