ThinkPHP5 动态生成图片缩略图
发布时间 - 2019-12-27 00:00:00 点击率:次thinkphp5动态生成图片缩略图
需求场景
不同终端(PC端、手机端、平板),不同界面(列表页、详情页),对图片大小的要求不一样, 如果所有场景下都使用同一尺寸的图片,势必对会网络带宽及服务器性能造成一定的影响,由此需要服务器端能够根据前端的请求参数,自动匹配出相对应的图片资源,以此来降低服务端的压力,同时也能给用户带来更友好的用户体验。
具体步骤如下:
1、开启apache的rewrite功能,具体方法请自行百度。
2、修改.htaccess
Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f R ewriteRule ^public/upload/(.*)/(.*)/(.*)_(\d+)_(\d+).(png|jpg|jpeg|gif)$ /index.php/api/Attachment/thumbnail/module/$1/date/$2/original/$3/width/$4/height/$5/ext/$6 [L,R] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
以上配置规则表示,如果存在对应的图片资源,则由apache直接返回,如果不存在,则转发给/index.php/api/Attachment/thumbnail处理器去处理。
其它参数说明:
$1:图片所属模块
$2:图片上传日期
:原始图片名称(不含后缀)
$4:目标图片宽度
$5:目标图片高度
$6:图片后缀
友情提示:根据图片存储规则的不同,此处的配置规则及参数可以作相应的调整。
3、新增缩略图处理程序,此处为Attachment 文件,内容如下:
public function thumbnail() {
$savePath = Config::get('attachment_path');
$defaultImage = $savePath.'default.jpg';
$params = Request::instance()->param();
$module = $params['module']; // 图片所属模块
$date = $params['date']; // 图片上传日期
$original = $params['original']; // 原始图片名称(不含后缀)
$width = $params['width']; // 目标图片宽度
$height = $params['height']; // 目标图片高度
$ext = $params['ext']; // 图片后缀
$originName = sprintf('%s%s/%s/%s.%s',$savePath,$module,$date,$original,$ext);
$targetName = sprintf('%s%s/%s/%s_%s_%s.%s',$savePath,$module,$date,$original,$width,$height,$ext);
if (!file_exists($originName)) {
$originName = $defaultImage;
$targetName = sprintf('%sdefault_%s_%s.jpg',$savePath,$width,$height);
}
$image = Image::open($originName);
$thumb = $image->thumb($width, $height);
if (!file_exists($targetName)) {
$thumb->save($targetName);
}
$thumb->preview();
}4、vendor/topthink/think-image/src/Image.php文件中新增一个方法,内容如下:
/**
* 预览图像
* @param int $quality 图像质量
* @param bool $interlace 是否对JPEG类型图像设置隔行扫描
* @return $this
*/
public function preview($quality = 100, $interlace = true)
{
$type = $this->info['type'];
header('content-type:'.$this->info['mime']);
if ('jpeg' == $type || 'jpg' == $type) {
//JPEG图像设置隔行扫描
imageinterlace($this->im, $interlace);
imagejpeg($this->im, null, $quality);
} elseif ('gif' == $type && !empty($this->gif)) {
imagegif($this->im, null);
} elseif ('png' == $type) {
//设定保存完整的 alpha 通道信息
imagesavealpha($this->im, true);
//ImagePNG生成图像的质量范围从0到9的
imagepng($this->im, null, min((int) ($quality / 10), 9));
} else {
$fun = 'image' . $type;
$fun($this->im, '');
}
exit;
}5、访问示例
在浏览器中输入:http://域名/public/upload/news/20190325/442b8dba3f706cf6822c1255bcaa68de_320_240.jpg,将会看到一张宽320,高240的图片。
# php
# public
# apache
# http
# 不含
# 图片上传
# 将会
# 不存在
# 能给
# 友情提示
# 相对应
# 网络带宽
# 则由
# 服务端
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何做网站制作流程,*游戏网站怎么搭建?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
简历没回改:利用AI润色让你的文字更专业
公司门户网站制作流程,华为官网怎么做?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Python制作简易注册登录系统
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Laravel Session怎么存储_Laravel Session驱动配置详解
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
nodejs redis 发布订阅机制封装实现方法及实例代码
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何在橙子建站中快速调整背景颜色?
Laravel怎么在Blade中安全地输出原始HTML内容
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Bootstrap整体框架之CSS12栅格系统
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何快速启动建站代理加盟业务?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何在新浪SAE免费搭建个人博客?
如何在IIS7中新建站点?详细步骤解析
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
JS碰撞运动实现方法详解
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
详解Android图表 MPAndroidChart折线图
如何获取免费开源的自助建站系统源码?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
高端网站建设与定制开发一站式解决方案 中企动力
Laravel如何实现API版本控制_Laravel版本化API设计方案
Python高阶函数应用_函数作为参数说明【指导】
如何登录建站主机?访问步骤全解析
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
如何快速查询网站的真实建站时间?
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
网站建设保证美观性,需要考虑的几点问题!
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
网站制作报价单模板图片,小松挖机官方网站报价?
上一篇:《猿编程》清除缓存方法
上一篇:《猿编程》清除缓存方法


ewriteRule ^public/upload/(.*)/(.*)/(.*)_(\d+)_(\d+).(png|jpg|jpeg|gif)$ /index.php/api/Attachment/thumbnail/module/$1/date/$2/original/$3/width/$4/height/$5/ext/$6 [L,R]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]