【问题标题】:Laravel 5 intervention-image / intervention-cache: flexible url / routingLaravel 5 干预图像/干预缓存:灵活的 url/路由
【发布时间】:2015-05-19 20:45:59
【问题描述】:

在 Laravel 5 中摆弄Intervention 2.0。我想要的是操纵图像(大小和裁剪)并使用干预Image Caching 来缓存图像。我基本上试图实现的是旧的(和不安全的)timthumb.php 的功能。

我开始以此为例:

// routes.php
Route::get('imager/{src?}', function ($src)
{
    $cacheimage = Image::cache(function($image) use ($src) {
        return $image->make("files/image/".$src)->resize(100,50);
    }, 10, true);

    return Response::make($cacheimage, 200, array('Content-Type' => 'image/jpeg'));
});

当我像这样加载图像时:

// template
<img src="{{"imager/image.jpg"}}"/>

效果很好。

但是...在我的情况下,图像可以位于不同的(子)目录中,有时甚至是多个级别。它们由他们的网站管理员在我的 CMS 中维护。

示例:

  • 文件/图像/image.jpg
  • 文件/图像/标题/图像.jpg
  • 文件/图像/背景/颜色/图像.jpg
  • img/common/logo.png

这些图像 url 是从 mysql 表记录中加载的。

加载此类图片时:

// template
<img src="{{"imager/files/images/image.jpg"}}"/>

该路线不再有效。毕竟,filesimagesimages.jpg 都是 url 段,它们的数量可能不同

图片url(粗体)应作为一个变量处理:

Route::get('imager/files/images/image.jpg', function ($src = false)

然后我应该能够将尺寸和裁剪参数传递给偏离路线。因为 img url 的长度可能会有所不同,所以我假设我可以使用 ?w=100&h=50&c=true 之类的查询来传递参数?


更新

当我对图片网址使用查询参数时:

Route::get('imager', function ()
{
    $src = Input::get('src', 1);

    $cacheimage = Image::cache(function($image) use ($src) {
        return $image->make($src)->resize(100,100);
    }, 1, false); // one minute cache expiry

    return Response::make($cacheimage, 200, array('Content-Type' => 'image/jpeg'));
});

// template
<img src="{{"imager?src=files/images/image.jpg"}}"/>

这行得通。

【问题讨论】:

  • 也许解决这个问题的最好方法是使用 mod_rewrite(如果你在 Apache 上)并执行类似的操作:RewriteRule ^imager/([.*])\.[jpg|gif| png]$ imager?src=$1
  • 我在一个旧的 Laravel 4 项目中也遇到了这个问题。我将所有路径和子路径添加到图像缓存配置文件中的路径部分。

标签: php image caching laravel laravel-5


【解决方案1】:

这很简单。你只需要告诉 Laravel 你的图像参数由字母、斜线、破折号、下划线和点 ('[A-Za-z0-9\/\.\-\_]+') 组成,因为默认情况下框架匹配除斜线 / 之外的所有内容。

Route::get('imager/{image?}', function($src) {

    $cachedImage = Image::cache(function($image) use ($src) {
        return $image->make($src)->resize(100,100);
    }, 1, false);

    return Response::make($cachedImage, 200, ['Content-Type' => 'image/jpeg']);
})->where('image', '[A-Za-z0-9\/\.\-\_]+');

您可以在documentation 中找到有关参数绑定的更多信息。

【讨论】:

    【解决方案2】:

    现在您可以使用URL based image manipulation

    在 Laravel 应用程序中,可以使用 URL 来动态操作图像。图像的操作版本将存储在缓存中,直接加载,无需资源密集型 GD 操作。

    一张图片只能上传一次。当通过这样的 HTTP 请求访问文件时,所有操作(如调整大小或裁剪)都将在稍后处理:

    http://yourhost.com/{route-name}/{template-name}/{file-name}

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2016-01-26
      • 2015-10-31
      • 1970-01-01
      • 2020-01-25
      • 2015-02-09
      相关资源
      最近更新 更多