使用symfony制作一个快速图片处理服务

Mario Sanchez

17 people read
Thumbnail
当我们在使用云服务时,特别是OSS服务管理图片时,可以很方便的从云服务动态返回图片的参数,比如说图片尺寸、格式、水印等
就像 a.jpg?w=100&fm=wepb等各种参数
接下来我就为大家演示一下如何使用symfony配合其它组件快速制作一个类似的服务

首先我们需要安装GD库,然后创建一个symfony项目。接下来生成一个控制器,把/路由返回到index.html.twig上

# src\Controller\IndexController.php
class IndexController extends AbstractController
{
    #[Route('/', name: 'app_index')]
    public function index(): Response
    {
        return $this->render('index/index.html.twig', [
            'controller_name' => 'IndexController',
        ]);
    }
}

同时我们写一个路由,用于处理图片请求

# src\Controller\IndexController.php
    #[Route('/image', name: 'image')]
    public function getImage(Request $request)
    {        
    }

在index.html.twig上写一个图片标签

  <img src="{{ path('image',{
        path:'a.jpg',
        fm:'webp',
        w:100,
        h:200,
        fit:'crop'
    }) }}">

因为我是做测试,所以我提前在项目的public/images/目录里放置了a.jpg图片文件。在twig里请求/image这个路由

接下来安装一个库:

composer req league/glide-symfony

然后去处理我们的图片

# src\Controller\IndexController.php
use League\Glide\Responses\SymfonyResponseFactory;
use League\Glide\ServerFactory;

    #[Route('/image', name: 'image')]
    public function getImage(Request $request)
    {
        $server = ServerFactory::create([
            'source' => $this->getParameter('kernel.project_dir') . '/public/images',
            'cache' => $this->getParameter('kernel.project_dir') . '/public/cache',
        ]);
        $query = $request->query->all();
        $path = $query['path'];
        unset($query['path']);
        $server->outputImage($path, $query);
        return new Response();
    }

刷新页面,效果是不是就出来了?除了一个小小的问题:

我们查看开发者工具,然后在网络里找到image这个请求,查看“预览”或者“响应”,是不是看到了乱码?接下来我们再稍微修改一下代码:

#[Route('/image', name: 'image')]
    public function getImage(Request $request): Response
    {
        $server = ServerFactory::create([
            'response' => new SymfonyResponseFactory(),
            'source' => $this->getParameter('kernel.project_dir') . '/public/images',
            'cache' => $this->getParameter('kernel.project_dir') . '/public/cache',
        ]);
        $query = $request->query->all();
        $path = $query['path'];
        unset($query['path']);
        return $server->getImageResponse($path, $query);
    }

刷新: 完美了

About Me

我是一位精通 Symfony 框架和 API Platform 的开发者,擅长构建高效、可扩展的 Web 应用程序和 API。 此外,我还具备 PrestaShop 模块开发经验,能够为您的电商平台定制功能,满足特定业务需求。