那天和别个小组交叉检查代码的时候,看到他们的图片是通过DataURI的方式去实现的。大概长这样。
![](http://upload-images.jianshu.io/upload_images/1370471-b17e8447d83ffcc7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这种写法看起来并非炫技。就问为什么要这样写呀。原来图片都保存在laravel框架的storage目录,服务器不能直接访问该目录,但是在php执行的过程中则可以访问。他们就不知道怎么写图片的链接地址了。所以问题就变成了“怎么在php脚本中输出一张图片“。
一个简单的小例子
假如网站根目录下有index.php和1.jpg,通过下面的程序![](index.php)
能起到和![](1.jpg)
一样的效果。
<?php
header('Content-type: image/jpg');
echo file_get_contents('1.jpg');
在laravel中实现
试想一下:在storage/images/目录下有1.jpg和2.jpg这两张图片,要怎么能够才能通过/imgsys/1.jpg和/imgsys/2.jpg来访问到这两张图片啦?如果3.jpg在storage/images/other/3.jpg,那么怎么能够通过/imgsys/other/3.jpg来访问啦?
解决这个问题就要涉及到laravel框架里的路由功能了。在routes.php中添加如下代码:
Route::get('imgsys/{one?}/{two?}/{three?}/{four?}/{five?}/{six?}/{seven?}/{eight?}/{nine?}',function(){
\App\Util\ImageRoute::imageStorageRoute();
});
是不是觉得imgsys/{one?}/{two?}/{three?}/{four?}/{five?}/{six?}/{seven?}/{eight?}/{nine?}
有一些冗余。确实是这样的,但是laravel所提供的Route::get()
方法自己没有找到支持不定参数的写法,不得以才这么写的,这样写的坏处是参数是有长度限制的。不过目录不是很深的话,还是够用了。
ImageRoute.php
<?php
namespace App\Util;
use Illuminate\Support\Facades\Request;
class ImageRoute
{
static public function imageStorageRoute(){
//获取当前的url
$realpath = str_replace('sysimg/','',Request::path());
$path = storage_path() . $realpath;
if(!file_exists($path)){
//报404错误
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
exit;
}
//输出图片
header('Content-type: image/jpg');
echo file_get_contents($path);
exit;
}
}
这样就大功告成了!