對象存儲 ( Object Storage Service, 簡稱 OSS ) OSS 相信大家都聽過, 它是阿里云對外提供的海量, 安全和高可靠的云存儲服務. 大家可以把自己網站的資源存上面加快自己網站速度, aliyun 官網也有文檔不過對于新手來說有點難, 那么這里我給大家推薦一個組件和組件的使用.
johnlui/aliyun-oss
?這個組件是?John Lui
?作者封裝好的組件, 用法超簡單, 不過這個組件有許多要注意的地方, 不然出錯了, 掉坑里爬不出來!
安裝
composer require "johnlui/aliyun-oss"
配置
組件下載完成之后, 作者的 GitHub 上面說需要在?app/config/app.php
?中增加四項配置, 我建議在?app/config
?下面新建一個?alioss.php
?文件然后在添加配置:
<?php
return [ 'ossServer' => env('ALIOSS_SERVER', null), // 外網'ossServerInternal' => env('ALIOSS_SERVERINTERNAL', null), // 內網'AccessKeyId' => env('ALIOSS_KEYID', null), // key'AccessKeySecret' => env('ALIOSS_KEYSECRET', null), // secret'BucketName' => env('ALIOSS_BUCKETNAME', null) // bucket
];
然后在?.ENV
?文件里面把配置信息都填上.
注意
這里有一個大坑, 粗心的朋友一般不會發現, 在填寫外網和公網配置的時候, 有的朋友直接在 OSS 管理控制臺中把外網和內網一長串的鏈接復制走, 如下圖:
在這個組件中, 桶名稱是需要額外填寫的, 所以外網和內網哪兒, 只需要填寫桶名后面的內容, 如圖:
再有一點是填寫外網和內網的時候需要加上?http://
?協議, 不然后面出錯你又得掉坑半天出不來, 最終配置信息如下圖:
構建 Service 文件
后臺需要一個?Service
?文件, 在?app/Service
?下新建一個?oss.php
?文件, 由于前面步驟我把配置文件放在?app/config/alioss.php
?里面, 所以還要對原作者給出的例子作修改下, 如下代碼:
# oss.php
<?phpnamespace App\Services;use JohnLui\AliyunOSS\AliyunOSS;class OSS
{private $ossClient;private static $bucketName;public function __construct($isInternal = false){$serverAddress = $isInternal ? config('alioss.ossServerInternal') : config('alioss.ossServer');$this->ossClient = AliyunOSS::boot($serverAddress,config('alioss.AccessKeyId'),config('alioss.AccessKeySecret'));}public static function upload($ossKey, $filePath){$oss = new OSS(false); // 上傳文件使用內網,免流量費$oss->ossClient->setBucket(config('alioss.BucketName'));$res = $oss->ossClient->uploadFile($ossKey, $filePath);return $res;}/*** 直接把變量內容上傳到oss* @param $osskey* @param $content*/public static function uploadContent($osskey, $content){$oss = new OSS(false); // 上傳文件使用內網,免流量費$oss->ossClient->setBucket(config('alioss.BucketName'));$oss->ossClient->uploadContent($osskey, $content);}/*** 刪除存儲在oss中的文件** @param string $ossKey 存儲的key(文件路徑和文件名)* @return*/public static function deleteObject($ossKey){$oss = new OSS(false); // 上傳文件使用內網,免流量費return $oss->ossClient->deleteObject(config('alioss.BucketName'), $ossKey);}/*** 復制存儲在阿里云OSS中的Object** @param string $sourceBuckt 復制的源Bucket* @param string $sourceKey - 復制的的源Object的Key* @param string $destBucket - 復制的目的Bucket* @param string $destKey - 復制的目的Object的Key* @return Models\CopyObjectResult*/public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey){$oss = new OSS(true); // 上傳文件使用內網,免流量費return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);}/*** 移動存儲在阿里云OSS中的Object** @param string $sourceBuckt 復制的源Bucket* @param string $sourceKey - 復制的的源Object的Key* @param string $destBucket - 復制的目的Bucket* @param string $destKey - 復制的目的Object的Key* @return Models\CopyObjectResult*/public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey){$oss = new OSS(true); // 上傳文件使用內網,免流量費return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);}public static function getUrl($ossKey){$oss = new OSS();$oss->ossClient->setBucket(config('alioss.BucketName'));return $oss->ossClient->getUrl($ossKey, new \DateTime("+1 day"));}public static function createBucket($bucketName){$oss = new OSS();return $oss->ossClient->createBucket($bucketName);}public static function getAllObjectKey($bucketName){$oss = new OSS();return $oss->ossClient->getAllObjectKey($bucketName);}/*** 獲取指定Object的元信息** @param string $bucketName 源Bucket名稱* @param string $key 存儲的key(文件路徑和文件名)* @return object 元信息*/public static function getObjectMeta($bucketName, $osskey){$oss = new OSS();return $oss->ossClient->getObjectMeta($bucketName, $osskey);}}
使用
首先引入命名空間?use App\Services\OSS;
, 在?Laravel 5.1
?中使用方法如下
// 獲取表單提交的圖片
$pic = $request->file('pic');
// 判斷圖片有效性
if (!$pic->isValid()) { return back()->withErrors('上傳圖片無效..');
}
// 獲取圖片在臨時文件中的地址
$pic = $pic->getRealPath();
// 制作文件名
$key = time() . rand(10000, 99999999) . '.jpg';
//阿里 OSS 圖片上傳
$result = OSS::upload($key, $pic);
if ($result) { // success
} else {// fail
}
注意:?如果你上傳長時間沒反應的話, 說明你上傳使用的是內網, 你得改成外網上傳, 找到?Service/oss.php
?里面的?upload
?方法, 將?$oss = new OSS(true);
?true 改為 false, 上傳程序即可成功!
附上其他使用方法
OSS::upload('文件名', '本地路徑'); // 上傳一個文件echo OSS::getUrl('某個文件的名稱'); // 打印出某個文件的外網鏈接OSS::createBucket('一個字符串'); // 新增一個 Bucket。注意,Bucket 名稱具有全局唯一性,也就是說跟其他人的 Bucket 名稱也不能相同。OSS::getAllObjectKey('某個 Bucket 名稱'); // 獲取該 Bucket 中所有文件的文件名,返回 Array。
原文出處