热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP上传图片并压缩为缩略图

使用thinkphp开发app后端中,需要实现一个处理上传图片队列的功能这是一个上传多图片并且需要对其中一张图片进行压缩,使之成为缩略图方便用于在ap

使用thinkphp开发app后端中,需要实现一个处理上传图片队列的功能

这是一个上传多图片并且需要对其中一张图片进行压缩,使之成为缩略图方便用于在app端预览
(使用的html5 mui框架开发app,如果直接载入原图,app客户端列表中图稍微多几张就会使得webview十分卡顿,建议在开发中,一定要对用户上传的图片进行服务器端的压缩)

之前已经写过一篇关入如何使用html5+的uploader上传多张图片到服务器的博客:
http://www.cnblogs.com/devilyouwei/p/6790255.html
并且实现了在前端进行压缩的功能(这是第一次压缩,有用户手机端进行)

上传到服务器后我们还需对图片进行处理,我这里使用的php作为后端语言,框架为thinkphp5

需要用到thinkphp的File类和Image类
File类:前者获取到用户上传的file(文件)并进行路径和文件名的操作
File类下的方法众多,主要有以下一些,使用之前应该先打印看一下,随意找一个文件测试一下效果,可以看的更加明白些:

$file = new File(ROOT_PATH."/public/uploads/20170506/abc.jpg");
$arr = ['getATime' => $file->getATime(), //最后访问时间 'getBasename' => $file->getBasename(), //获取无路径的basename 'getCTime' => $file->getCTime(), //获取inode修改时间 'getExtension' => $file->getExtension(), //文件扩展名 'getFilename' => $file->getFilename(), //获取文件名 'getGroup' => $file->getGroup(), //获取文件组 'getInode' => $file->getInode(), //获取文件inode 'getLinkTarget' => $file->getLinkTarget(), //获取文件链接目标文件 'getMTime' => $file->getMTime(), //获取最后修改时间 'getOwner' => $file->getOwner(), //文件拥有者 'getPath' => $file->getPath(), //不带文件名的文件路径 'getPathInfo' => $file->getPathInfo(), //上级路径的SplFileInfo对象 'getPathname' => $file->getPathname(), //全路径 'getPerms' => $file->getPerms(), //文件权限 'getRealPath' => $file->getRealPath(), //文件绝对路径 'getSize' => $file->getSize(),//文件大小,单位字节 'getType' => $file->getType(),//文件类型 file dir link 'isDir' => $file->isDir(), //是否是目录 'isFile' => $file->isFile(), //是否是文件 'isLink' => $file->isLink(), //是否是快捷链接 'isExecutable' => $file->isExecutable(), //是否可执行 'isReadable' => $file->isReadable(), //是否可读 'isWritable' => $file->isWritable() //是否可写 ];print_r($arr);
return false;

print_r打印到浏览器后:

Array
([getATime] => 1494041766[getBasename] => abc.jpg[getCTime] => 1494041766[getExtension] => jpg[getFilename] => abc.jpg[getGroup] => 0[getInode] => 0[getLinkTarget] => D:\wamp\www\dashen\public\uploads\20170506\abc.jpg[getMTime] => 1494041766[getOwner] => 0[getPath] => D:\wamp\www\dashen\/public/uploads/20170506[getPathInfo] => SplFileInfo Object([pathName:SplFileInfo:private] => D:\wamp\www\dashen\/public/uploads/20170506[fileName:SplFileInfo:private] => 20170506)[getPathname] => D:\wamp\www\dashen\/public/uploads/20170506/abc.jpg[getPerms] => 33206[getRealPath] => D:\wamp\www\dashen\public\uploads\20170506\abc.jpg[getSize] => 571800[getType] => file[isDir] => [isFile] => 1[isLink] => [isExecutable] => [isReadable] => 1[isWritable] => 1
)

关于如何用thinkphp5处理上传的多张图片文件,专门写一个private方法来处理,最后返回处理好的图片的路径的数组
图片处理包括:
1. 将用户上传的图片保存到public/uploads/目录下
2. 按照日期建立目录,md5的编码时间作为文件名
3. 压缩其中第一张图片为缩略图,专门用于预览(也要保存到数据库)
4. 返回所有处理过图片的路径数组,由调用者处理后保存数据库

代码:

//文件上传转储(多文件),压缩首图
private function upload(){$files = request()->file();//遍历上传的图片foreach($files as $key=>$file){$info = $file->move(ROOT_PATH.'public/uploads');if($info){$data[$key] = $info->getSaveName();}else{return $file->getError();}//压缩第一张图if($key == 'img0'){$image = Image::open($info->getRealPath());$image->thumb(300, 200, Image::THUMB_CENTER)->save($info->getPath()."/thumb_".$info->getFilename());}}return $data;}

此方法中,压缩第一张图时需要用到原图的文件路径,名称等,我保存在原图同一目录下,在原图前面加上“thumb_”前缀作为区别。

调用upload方法的控制器方法(外部方法):

//用户提交疑难
public function addQues(){//验证登陆sessionif(!session("?user_info"))return ['info'=>'登录状态失效','login'=>0];$ajax['title'] = input('post.title/s');$ajax['content'] = input('post.content/s');$ajax['star'] = input("post.star/s");$ajax['reward'] = input('post.reward/s');$ajax['message'] = input('post.message/s');$ajax['price'] = input('post.price/s');if($ajax['title']==null || $ajax['content']==null || $ajax['star']==null || $ajax['reward']==null)return ['info'=>'标题,内容,难度,悬赏方式不能为空','status'=>0];if($ajax['title']=="" || $ajax['content']=="" || $ajax['star']=="" || $ajax['reward']=="")return ['info'=>'标题,内容,难度,悬赏方式不能为空','status'=>0];/** 图片上传功能*/$ajax['uid'] = session("user_info")['id'];$ajax['create_time'] = time();$ajax['update_time'] = $ajax['create_time'];$ajax['ip'] = get_client_ip();//此处调用private upload方法获得图片路径数组if(request()->file()!=null){$imgs = $this->upload();$ajax = array_merge($ajax,$imgs);}$f = db("Ask")->insert($ajax);if($f>=1)return['status'=>1,'info'=>'问题提交成功'];elsereturn['status'=>0,'info'=>'数据插入失败'];
}


推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
author-avatar
xkxk22
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有