>  기사  >  PHP 프레임워크  >  ThinkPHP 프로젝트에 이미지 크기의 동적 자르기 기능을 추가하는 방법

ThinkPHP 프로젝트에 이미지 크기의 동적 자르기 기능을 추가하는 방법

藏色散人
藏色散人앞으로
2021-04-08 16:18:032364검색

다음 튜토리얼 칼럼인 thinkphp에서는 ThinkPHP 프로젝트에서 이미지 크기에 대한 동적 자르기 기능을 추가하는 방법을 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!

ThinkPHP 프로젝트에 이미지 크기의 동적 자르기 기능을 추가하는 방법

ThinkPHP 프로젝트에 이미지 크기의 동적 자르기 기능을 추가하세요

ThinkPHP 이미지의 동적 자르기 및 크기 조정 라이브러리

먼저 프로젝트 주소를 첨부하세요: https://github.com/top-think/think -glide

Glide 지정된 매개변수를 기반으로 브라우저용 이미지 콘텐츠를 동적으로 생성하여 동적 이미지 자르기, 워터마킹 등을 실현할 수 있는 이미지 조작 라이브러리입니다. 이 라이브러리에는 Glide에 대한 친숙한 패키징 및 확장 기능이 있어 일부 낮은 수준의 추상화를 통해 ThinkPHP 사용자는 ThinkPHP 프로젝트의 이미지에 동적 자르기 기능을 추가할 수 있습니다.

Installation

다음 명령을 실행하여 설치하세요.

$ composer require slince/think-glide

Usage

빠른 시작

ThinkPHP 5.1.6부터 미들웨어 기능이 추가되었으므로

    ThinkPHP 5.1.6 이상에서는 미들웨어 등록을 사용하세요. :
  • application/middleware.php 파일을 열고(없으면 생성하세요) 미들웨어를 등록하세요.

    return [
        //...
    
        \Slince\Glide\GlideMiddleware::factory([
            'source' => __DIR__ . '/../img',
        ])
    ];

    이 방법은 비교적 간단하고 권장됩니다. application/middleware.php 文件(如果不存在创建即可),注册 middleware:

    // 在 /route/route.php 注册下面路由
    Route::get('images/:file', 'index/handleImageRequest');
    
    //在控制器 index 里创建action
    public function handleImageRequest()
    {
        $middleware = \Slince\Glide\GlideMiddleware::factory([
            'source' => App::getRootPath() . '/img',
        ]);
        
        return $middleware(app('request'), function(){
            return app('response');
        });
    }

    这种方式比较简单,也是推荐的方式;

  • ThinkPHP 5.1.0 以上 5.1.6 以下版本:

    不支持middleware,所以启用过程要复杂一点,我们用下面方式来妥协:

    http://youdomain.com/images/user.jpg?w=100&h=100

source 是你本地图片文件夹的位置,假设该目录下有图片 user.jpg, 打开浏览器访问下面链接:

\Slince\Glide\GlideMiddleware::factory([
    'source' => __DIR__ . '/../img',
    'signKey' => 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*'
])

即可得到缩小后的图片。

参数说明

参数名 类型 说明 是否必选
source string 本地文件夹位置
cache string 缓存文件位置,默认在 runtime/glide 下面
cacheTime string 缓存时间,示例 +2 days, 缓存期间多次请求会自动响应 304
signKey string 安全签名
onException callable 异常处理handler
baseUrl string 路由前缀,匹配到该前缀时中间件开始执行,默认是 /images

安全签名

不开启安全签名的情况下用户可以调整query里面的参数自行对图片进行裁剪,如果你不打算这么做的话,你可以通过
signKey 进行校验,

echo app('glide.url_builder')->getUrl('user.jpg', ['w' => 100, 'h' => 100]);

//你会得到如下链接:/images/user.jpg?w=100&h=100&s=af3dc18fc6bfb2afb521e587c348b904

这种情况下用户自行调整参数将会无效;生成安全的URL:

\Slince\Glide\GlideMiddleware::factory([
    'source' => __DIR__ . '/../img',
    'signKey' => 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*',
    'onException' => function(\Exception $exception, $request, $server){
    
        if ($exception instanceof \League\Glide\Signatures\SignatureException) {
            $response = new Response('签名错误', 403);
        } else {
            $response = new Response(sprintf('你访问的资源 "%s" 不存在', $request->path()), 404);
        }
        
        return $response;
    }
])

异常处理

如果用户访问了一张不存在的图片或者没有进行安全校验,系统会抛出异常,你可以通过 onException 进行替换默认行为:

rrreee

注意该闭包必须返回一个 thinkResponse

ThinkPHP 5.1.0 이상 및 5.1.6 이하:

는 미들웨어를 지원하지 않으므로 활성화 프로세스가 조금 더 복잡합니다.

rrreee

source 이 디렉토리에 user.jpg 사진이 있다고 가정하고, 브라우저를 열고 다음 링크를 방문하세요:

rrreee
축소된 사진입니다.
매개변수 설명

매개변수 이름 유형 설명 여부 필수 여부
소스 문자열 로컬 폴더 위치
캐시 문자열 캐시 파일 위치, 기본값은 런타임/글라이드 아니요
cacheTime 문자열 캐시 시간, 예: +2일, 캐시 해당 기간 동안 여러 요청이 자동으로 304 No
signKey string 보안 서명 td> 아니요
onException 호출 가능 예외 처리 핸들러 No
baseUrl string 라우팅 접두사, 미들웨어는 접두사가 일치할 때 실행을 시작합니다. 기본값은 다음과 같습니다. /images 아니요
보안 서명보안 서명이 켜져 있지 않으면 사용자는 다음을 수행할 수 있습니다. 쿼리의 매개변수를 조정하여 이미지를 직접 자르실 계획이 없다면
signKey를 통해 확인하실 수 있습니다.
rrreee🎜이 경우에는 사용자가 조정한 매개변수를 사용하세요. 유효하지 않습니다. 안전한 URL 생성: 🎜rrreee🎜예외 처리🎜 🎜사용자가 존재하지 않는 사진에 액세스하거나 보안 확인을 수행하지 않으면 시스템에서 onException을 통해 기본 동작을 대체할 수 있습니다. : 🎜rrreee🎜클로저는 thinkResponse를 반환해야 합니다. 🎜🎜빠른 참조🎜🎜글라이드는 자르기를 지원할 뿐만 아니라 다른 작업도 지원합니다. 여기를 참조하세요. 지원되는 매개변수를 보려면: 🎜🎜http://glide.thephpleague.com/1.0/api/quick-reference/🎜🎜🎜🎜🎜관련 권장 사항: 🎜최신 10개의 thinkphp 비디오 튜토리얼🎜🎜🎜🎜

위 내용은 ThinkPHP 프로젝트에 이미지 크기의 동적 자르기 기능을 추가하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제