今天把项目中上传功能封装成类,方便后面使用,简单的封装了一下,感觉还不怎么好,后面继续优化。

具体代码如下:
<?php
/**
* Created by PhpStorm.
* User: wady www.bcty365.com
* Date: 2017/8/16
* Time: 14:52
*/
namespace App\ThinkClass;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class UploadClass
{
/**
* @var UploadedFile $file;
*/
protected $file;
/**
* 上传错误信息
* @var string
*/
private $error = ''; //上传错误信息
private $fullPath='';//绝对地址
private $config = array(
'maxSize' => 3*1024*1024, //上传的文件大小限制 (0-不做限制)
'exts' => array('jpg','jpeg','gif','png','doc','docx','xls','xlsx','ppt','pptx','pdf','rar','zip'), //允许上传的文件后缀
'subName' => '', //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
'rootPath' => '/uploads/', //保存根路径
'savePath' => '', //保存路径
'thumb' => array(),//是裁剪压缩比例
);
public function __construct($config = array()){
/* 获取配置 */
$this->config = array_merge($this->config, $config);
if(!emptyempty($this->config['exts'])){
if (is_string($this->exts)){
$this->config['exts'] = explode(',', $this->exts);
}
$this->config['exts'] = array_map('strtolower', $this->exts);
}
$this->config['subName'] = $this->subName ? ltrim($this->subName,'/') : '/'.date('Ymd');
$this->fullPath = rtrim(public_path(),'/').$this->config['rootPath'];
}
public function __get($name) {
return $this->config[$name];
}
public function __set($name,$value){
if(isset($this->config[$name])) {
$this->config[$name] = $value;
}
}
public function __isset($name){
return isset($this->config[$name]);
}
/**
* 获取最后一次上传错误信息
* @return string 错误信息
*/
public function getError(){
return $this->error;
}
public function upload($file){
if(emptyempty($file)){
$this->error = '没有上传的文件';
return false;
}
if(!$this->checkRootPath($this->fullPath)){
$this->error = $this->getError();
return false;
}
$fileSavePath=$this->fullPath.$this->savePath.$this->subName;
if(!$this->checkSavePath($fileSavePath)){
$this->error = $this->getError();
return false;
}
$files =array();
if(!is_array($file)){
//如果不是数组转成数组
$files[]=$file;
}else{
$files=$file;
}
$info = array();
$imgThumb = new \App\ThinkClass\ThumbClass();
foreach ($files as $key=>$f){
$this->file=$f;
$f->ext = strtolower($f->getClientOriginalExtension());
/*文件上传检查*/
if (!$this->check($f)){
continue;
}
$fileName = str_random(12).'.'.$f->ext;
/* 保存文件 并记录保存成功的文件 */
if ($this->file->move($fileSavePath,$fileName)) {
/*图片按照宽高比例压缩*/
\Log::notice($fileSavePath.$fileName);
if(!emptyempty($this->thumb) && is_array($this->thumb)){
$imgThumb ->thumb($this->thumb,$fileSavePath.'/'.$fileName);
}
$info[]=$this->rootPath.$this->savePath.$this->subName.'/'.$fileName;
}
}
return is_array($info) ? $info : false;
}
/**
* 检测上传根目录
* @param string $rootpath 根目录
* @return boolean true-检测通过,false-检测失败
*/
protected function checkRootPath($rootpath){
if(!(is_dir($rootpath) && is_writable($rootpath))){
$this->error = '上传根目录不存在!';
return false;
}
return true;
}
/**
* 检测上传目录
* @param string $savepath 上传目录
* @return boolean 检测结果,true-通过,false-失败
*/
public function checkSavePath($savepath){
/* 检测并创建目录 */
if (!$this->mkdir($savepath )) {
return false;
} else {
/* 检测目录是否可写 */
if (!is_writable($savepath)) {
$this->error = '上传目录不可写!';
return false;
} else {
return true;
}
}
}
/**
* 检查上传的文件
* @param array $file 文件信息
*/
private function check($file) {
/* 检查文件大小 */
if (!$this->checkSize($file->getSize())) {
$this->error = '上传文件大小不符!';
return false;
}
/* 检查文件后缀 */
if (!$this->checkExt($file->ext)) {
$this->error = '上传文件后缀不允许';
return false;
}
/* 通过检测 */
return true;
}
/**
* 检查文件大小是否合法
* @param integer $size 数据
*/
private function checkSize($size) {
return !($size > $this->maxSize) || (0 == $this->maxSize);
}
/**
* 检查上传的文件后缀是否合法
* @param string $ext 后缀
*/
private function checkExt($ext) {
return emptyempty($this->config['exts']) ? true : in_array(strtolower($ext), $this->exts);
}
/**
* 创建目录
* @param string $savepath 要创建的穆里
* @return boolean 创建状态,true-成功,false-失败
*/
protected function mkdir($savepath){
if(is_dir($savepath)){
return true;
}
if(mkdir($savepath, 0777, true)){
return true;
} else {
$this->error = "目录创建失败";
return false;
}
}
}
使用案例:
头部引用 use App\ThinkClass\UploadClass;
$upload = new UploadClass();
$upload->exts=array('jpg','png');
$upload->maxSize=5*1024*1024;
$upload->savePath='course/uid_6';
$file = $request->file('fileImg');
$aa = $upload->upload($file);
dd($aa);
总结
以上所述是小编给大家介绍的PHP Laravel 上传图片、文件等类封装,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# laravel
# 上传图片
# 文件类封装
# Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
# vuejs+element-ui+laravel5.4上传文件的示例代码
# 修改Laravel5.3中的路由文件与路径
# 在Laravel5中正确设置文件权限的方法
# PHP框架laravel的.env文件配置教程
# Laravel最佳分割路由文件(routes.php)的方式
# PHP Laravel实现文件下载功能
# Laravel框架文件上传功能实现方法示例
# Laravel基础-关于引入公共文件的两种方式
# 使用laravel指定日志文件记录任意日志
# Laravel5.1 框架文件管理操作实例分析
# 上传
# 错误信息
# 小编
# 上传文件
# 是否合法
# 多个
# 在此
# 还不
# 给大家
# 不存在
# 如果不是
# 不做
# 装了
# 所述
# 给我留言
# 转成
# 感谢大家
# 文件上传
# 疑问请
相关文章:
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何在腾讯云免费申请建站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在云主机上快速搭建网站?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何选择建站程序?包含哪些必备功能与类型?
如何通过商城自助建站源码实现零基础高效建站?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在VPS电脑上快速搭建网站?
北京网站制作网页,网站升级改版需要多久?
平台云上自主建站:模板化设计与智能工具打造高效网站
行程制作网站有哪些,第三方机票电子行程单怎么开?
中山网站制作网页,中山新生登记系统登记流程?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
招商网站制作流程,网站招商广告语?
学校建站服务器如何选型才能满足性能需求?
独立制作一个网站多少钱,建立网站需要花多少钱?
建站主机功能解析:服务器选择与快速搭建指南
C#如何在一个XML文件中查找并替换文本内容
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
如何选择高效响应式自助建站源码系统?
如何快速搭建安全的FTP站点?
小型网站建站如何选择虚拟主机?
如何使用Golang安装API文档生成工具_快速生成接口文档
如何用免费手机建站系统零基础打造专业网站?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何通过西部建站助手安装IIS服务器?
如何在新浪SAE免费搭建个人博客?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
SQL查询语句优化的实用方法总结
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何用AWS免费套餐快速搭建高效网站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
七夕网站制作视频,七夕大促活动怎么报名?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
网站app免费制作软件,能免费看各大网站视频的手机app?
网站网页制作专业公司,怎样制作自己的网页?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
如何用虚拟主机快速搭建网站?详细步骤解析
如何通过服务器快速搭建网站?完整步骤解析
如何自定义建站之星网站的导航菜单样式?
实例解析Array和String方法
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
微信小程序制作网站有哪些,微信小程序需要做网站吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。