阿里OSS存儲,php版demo

最近項目移到雲服務器,因此須要處理一下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 請入羣下載數組

相關文章
相關標籤/搜索