ThinkPHP 圖片動態裁切縮放庫
先附上項目網址: https://github.com/top-think/think-glide
Glide 是一個可以幫助你根據指定參數動態的生成圖片內容給瀏覽器的圖片操作庫,從而實現
圖片動態裁剪,打水印等,本庫對Glide 進行了一些友好的包裝與擴展,屏蔽了原生庫的一些底層抽象從而使得ThinkPHP 用戶可以在ThinkPHP 項目中
更好的添加圖片的動態裁剪功能。
Installation
執行下面指令安裝:
$ composer require slince/think-glide
Usage
Quick start
由於從ThinkPHP 5.1.6 開始加入了中間件的功能,所以在
-
ThinkPHP 5.1.6 以上版本使用middleware 註冊:
開啟
application/middleware.php
檔案(如果不存在建立即可),註冊middleware:return [ //... \Slince\Glide\GlideMiddleware::factory([ 'source' => __DIR__ . '/../img', ]) ];
登入後複製這種方式比較簡單,也是建議的方式;
-
ThinkPHP 5.1.0 以上5.1.6 以下版本:
不支援middleware,所以啟用過程要複雜一點,我們用下面方式來妥協:
// 在 /route/route.php 注册下面路由 Route::get('images/:file', 'index/handleImageRequest'); //在控制器 index 里创建action public function handleImageRequest() { $middleware = \Slince\Glide\GlideMiddleware::factory([ 'source' => App::getRootPath() . '/img', ]); return $middleware(app('request'), function(){ return app('response'); }); }
登入後複製
source
是你本地圖片文件夾的位置,假設該目錄下有圖片user.jpg
, 開啟瀏覽器存取下面連結:
http://youdomain.com/images/user.jpg?w=100&h=100
即可得到縮小後的圖片。
參數說明
參數名稱 | #類型 | ##說明是否必選 | |
---|---|---|---|
#string | 本機資料夾位置 | #是 | |
##cache |
string | ||
下面 | 否 |
cacheTime |
string |
, 快取期間多次要求會自動回應304 | 否 | #signKey | |
安全簽章 | #否 | ##onException | callable |
否 | baseUrl | string路由前綴,當配對到該前綴時中間件開始執行,預設是 |
#否
安全簽章
進行校驗,
\Slince\Glide\GlideMiddleware::factory([ 'source' => __DIR__ . '/../img', 'signKey' => 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*' ])
這種情況下使用者自行調整參數將會無效;產生安全的URL:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">echo app('glide.url_builder')->getUrl('user.jpg', ['w' => 100, 'h' => 100]);
//你会得到如下链接:/images/user.jpg?w=100&h=100&s=af3dc18fc6bfb2afb521e587c348b904</pre><div class="contentsignin">登入後複製</div></div>
異常處理
#如果使用者存取了一張不存在的圖片或沒有進行安全校驗,系統會拋出異常,你可以透過onException
進行取代預設行為:
\Slince\Glide\GlideMiddleware::factory([ 'source' => __DIR__ . '/../img', 'signKey' => 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*', 'onException' => function(\Exception $exception, $request, $server){ if ($exception instanceof \League\Glide\Signatures\SignatureException) { $response = new Response('签名错误', 403); } else { $response = new Response(sprintf('你访问的资源 "%s" 不存在', $request->path()), 404); } return $response; } ])
注意該閉包必須傳回一個
think\Response實例;
Quick reference