laravel中通过url访问存储在storage下面的图片

那天和别个小组交叉检查代码的时候,看到他们的图片是通过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;
    }
}

这样就大功告成了!

推荐阅读更多精彩内容