那天和別個(gè)小組交叉檢查代碼的時(shí)候感昼,看到他們的圖片是通過(guò)DataURI的方式去實(shí)現(xiàn)的澈歉。大概長(zhǎng)這樣系忙。
![](http://upload-images.jianshu.io/upload_images/1370471-b17e8447d83ffcc7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
這種寫法看起來(lái)并非炫技映跟。就問(wèn)為什么要這樣寫呀。原來(lái)圖片都保存在laravel框架的storage目錄拗小,服務(wù)器不能直接訪問(wèn)該目錄重罪,但是在php執(zhí)行的過(guò)程中則可以訪問(wèn)。他們就不知道怎么寫圖片的鏈接地址了。所以問(wèn)題就變成了“怎么在php腳本中輸出一張圖片“蛆封。
一個(gè)簡(jiǎn)單的小例子
假如網(wǎng)站根目錄下有index.php和1.jpg,通過(guò)下面的程序![](index.php)
能起到和![](1.jpg)
一樣的效果勾栗。
<?php
header('Content-type: image/jpg');
echo file_get_contents('1.jpg');
在laravel中實(shí)現(xiàn)
試想一下:在storage/images/目錄下有1.jpg和2.jpg這兩張圖片惨篱,要怎么能夠才能通過(guò)/imgsys/1.jpg和/imgsys/2.jpg來(lái)訪問(wèn)到這兩張圖片啦?如果3.jpg在storage/images/other/3.jpg围俘,那么怎么能夠通過(guò)/imgsys/other/3.jpg來(lái)訪問(wèn)啦砸讳?
解決這個(gè)問(wèn)題就要涉及到laravel框架里的路由功能了。在routes.php中添加如下代碼:
Route::get('imgsys/{one?}/{two?}/{three?}/{four?}/{five?}/{six?}/{seven?}/{eight?}/{nine?}',function(){
\App\Util\ImageRoute::imageStorageRoute();
});
是不是覺(jué)得imgsys/{one?}/{two?}/{three?}/{four?}/{five?}/{six?}/{seven?}/{eight?}/{nine?}
有一些冗余界牡。確實(shí)是這樣的簿寂,但是laravel所提供的Route::get()
方法自己沒(méi)有找到支持不定參數(shù)的寫法,不得以才這么寫的宿亡,這樣寫的壞處是參數(shù)是有長(zhǎng)度限制的常遂。不過(guò)目錄不是很深的話,還是夠用了挽荠。
ImageRoute.php
<?php
namespace App\Util;
use Illuminate\Support\Facades\Request;
class ImageRoute
{
static public function imageStorageRoute(){
//獲取當(dāng)前的url
$realpath = str_replace('sysimg/','',Request::path());
$path = storage_path() . $realpath;
if(!file_exists($path)){
//報(bào)404錯(cuò)誤
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
exit;
}
//輸出圖片
header('Content-type: image/jpg');
echo file_get_contents($path);
exit;
}
}
這樣就大功告成了克胳!