PHP Laravel 上传图片、文件等类封装

时间:2022-11-04 15:25:21

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

具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<?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; 

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

原文链接:http://www.cnblogs.com/bcty365/archive/2017/08/16/7373000.html