• thinkphp5.1 封装文件上传模块


    成品展示

    批量上传文件,并获取详情

     上传单个文件,并获取详情

    批量上传文件,只获取路径

     上传单个文件只获取路径信息

    怎么实现的呢?

    我在appextra模块下新建一个文件上传类 ExtraUpload.php,目前只支持image、audio、video、file四种类型的文件,可通过config属性扩展。下面就是我封装的类。

    <?php
    namespace appextra;
    /* 
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    //适配移动设备图片上传
    use thinkException;
    use thinkfacadeRequest;
    
    class ExtraUpload{
        
        /**
         * 默认上传配置
         * @var array
         */
        private $config = [
            'image' => [
                'validate' => [
                    'size' => 10*1024*1024,
                    'ext'  => 'jpg,png,gif,jpeg',
                ],
                'rootPath'      =>  './Uploads/images/', //保存根路径
            ],
            'audio' => [
                'validate' => [
                    'size' => 100*1024*1024,
                    'ext'  => 'mp3,wav,cd,ogg,wma,asf,rm,real,ape,midi',
                ],
                'rootPath'      =>  './Uploads/audios/', //保存根路径
            ],
            'video' => [
                'validate' => [
                    'size' => 100*1024*1024,
                    'ext'  => 'mp4,avi,rmvb,rm,mpg,mpeg,wmv,mkv,flv',
                ],
                'rootPath'      =>  './Uploads/videos/', //保存根路径
            ],
            'file' => [
                'validate' => [
                    'size' => 5*1024*1024,
                    'ext'  => 'doc,docx,xls,xlsx,pdf,ppt,txt,rar',
                ],
                'rootPath' =>  './Uploads/files/', //保存根路径
            ],
        ];
        private $domain;
        function __construct()
        {
            //获取当前域名
            $this->domain = Request::instance()->domain();
        }
    
        public function upload($fileName){
           if(empty($_FILES) || empty($_FILES[$fileName])){
               return '';
           }
           try{
               $file = request()->file($fileName);
               if (is_array($file)){
                   $path = [];
                   foreach ($file as $item){
                       $path[] =  $this->save($item);
                   }
               } else {
                   $path = $this->save($file);
               }
               return $path;
           } catch (Exception $e){
               $arr = [
                   'status' => 0,
                   'message' => $e->getMessage(),
               ];
               header('Content-Type: application/json; charset=UTF-8');
               exit(json_encode($arr));
           }
       }
       public function uploadDetail($fileName){
           if(empty($_FILES) || empty($_FILES[$fileName])){
               return [];
           }
           try{
               $file = request()->file($fileName);
               if (is_array($file)){
                   $path = [];
                   foreach ($file as $item){
                       $detail = $item->getInfo();
                       $returnData['name'] = $detail['name'];
                       $returnData['type'] = $detail['type'];
                       $returnData['size'] = $detail['size'];
                       $returnData['filePath'] = $this->save($item);
                       $returnData['fullPath'] = $this->domain.$returnData['filePath'];
                       $path[] = $returnData;
                   }
               } else {
                   $detail = $file->getInfo();
                   $returnData['name'] = $detail['name'];
                   $returnData['type'] = $detail['type'];
                   $returnData['size'] = $detail['size'];
                   $returnData['filePath'] = $this->save($file);
                   $returnData['fullPath'] = $this->domain.$returnData['filePath'];
                   $path = $returnData;
               }
               return $path;
           } catch (Exception $e){
               $arr = [
                   'status' => 0,
                   'message' => $e->getMessage(),
               ];
               header('Content-Type: application/json; charset=UTF-8');
               exit(json_encode($arr));
           }
       }
       private function getConfig($file){
           $name = pathinfo($file['name']);
           $end = $name['extension'];
           foreach ($this->config as $key=>$item){
               if ($item['validate']['ext'] && strpos($item['validate']['ext'], $end) !== false){
                   return $this->config[$key];
               }
           }
           return null;
       }
       private function save(&$file){
           $config = $this->getConfig($file->getInfo());
           if (empty($config)){
               throw new Exception('上传文件类型不被允许!');
           }
           // 移动到框架应用根目录/uploads/ 目录下
           if ($config['validate']) {
               $file->validate($config['validate']);
               $result = $file->move($config['rootPath']);
           } else {
               $result = $file->move($config['rootPath']);
           }
           if($result){
               $path = $config['rootPath'];
               if (strstr($path,'.') !== false){
                   $path = str_replace('.', '', $path);
               }
               return $path.$result->getSaveName();
           }else{
               // 上传失败获取错误信息
               throw new Exception($file->getError());
           }
       }
    }

    怎么使用?

    接口使用

    在appapi下新建一个upload.php,代码如下:

    <?php
    namespace appapicontroller;
    
    
    class Upload
    {
    
        public function upload(){
            $p = new appextraExtraUpload();
            $file = $p->upload('file');
            $this->returnMessage($file);
        }
        public function uploadDetail(){
            $p = new appextraExtraUpload();
            $file = $p->uploadDetail('file');
            $this->returnMessage($file);
        }
        private function returnMessage($data){
            $arr = [
                'status' => 1,
                'message' => '文件上传成功',
                'data'=> $data,
            ];
            header('Content-Type: application/json; charset=UTF-8');
            exit(json_encode($arr));
        }
    }

    内部调用,从上面接口可以看到直接执行一下代码即可实现内部调用

    $p = new appextraExtraUpload();
    $file = $p->uploadDetail('file');

     

  • 相关阅读:
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    web安全
    Jodd——java瑞士军刀
  • 原文地址:https://www.cnblogs.com/hardykay/p/12671521.html
Copyright © 2020-2023  润新知