hardykay

成品展示

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

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

 

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

 

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

 

 

 

怎么实现的呢?

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

<?php
namespace app\extra;
/* 
 * 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 think\Exception;
use think\facade\Request;

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());
       }
   }
}

怎么使用?

接口使用

在app\api下新建一个upload.php,代码如下:

<?php
namespace app\api\controller;


class Upload
{

    public function upload(){
        $p = new \app\extra\ExtraUpload();
        $file = $p->upload(\'file\');
        $this->returnMessage($file);
    }
    public function uploadDetail(){
        $p = new \app\extra\ExtraUpload();
        $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 \app\extra\ExtraUpload();
$file = $p->uploadDetail(\'file\');

 

 

分类:

技术点:

相关文章:

  • 2021-04-14
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2022-12-23
  • 2021-04-21
  • 2021-06-02
猜你喜欢
  • 2021-09-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案