封装好的php上传文件类,PHP Laravel 上传图片、文件等类封装

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

具体代码如下:

/**

* 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 上传图片、文件等类封装,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值