文件上传
<h4>1. 文件上传</h4>
<p>1.框架里面已下载 阿里云,腾讯云,七牛云的云存储sdk,相关代码引入如下: </p>
<p>注意:若上传到本地必须在/public/storage/upload/  目录下创建于应用文件夹名称一致的包,用于存储上传的文件(若随意存储会导致上传失败)建议直接参考下方代码示例开发</p>
<pre><code class="language-php"><?php 
namespace app\base\controller\admin\system;
use think\facade\Db;
use Ramsey\Uuid\Uuid;
use OSS\OssClient;
use OSS\Core\OssException;
use think\facade\Filesystem;
use think\facade\Session;
use app\base\model\BaseModel;
use app\base\controller\BaseAdmin;
use Qcloud\Cos\Client;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
/**
* 媒体类
**/
class Media extends BaseAdmin
{
    /**
     * 上传文件
     * @return \think\Response
     */
    public function upload()
    {   
        $uid = Session::get("uid");
        // 获取表单上传文件
        $file = request()->file('file');
        if(!$file) return error('未检测到上传资源');
        $res = [];
        $storage = BaseModel::getStorageInfo(); //获取存储配置
        $type = $storage['type'] ?? 1;
        switch ($type) {
            case 1: //本地
            $res = $this->uploadLocal($file);
                break;
            case 2: //阿里云
                $res = $this->uploadOss($storage,$file);
                break;
            case 3: //腾讯云
                $res = $this->uploadCos($storage,$file);
                break;
            case 4:  //七牛
                $res = $this->uploadKodo($storage,$file);
                break;
        }
        if($res == 'error') return error('上传失败');
        return success('上传成功',$res);
    }
    /**
    * 上传到本地
    * @return \think\Response
    */
    public function uploadLocal($file)
    {
        $domain = $this->req->domain();
        // $imgTruePath = $file->getPathname(); //获取临时地址
        $ext = $file->extension(); //获取后缀
        $minType = $file->getMime(); //获取文件类型
        $fileName = $file->getOriginalName(); //获取上传名
        $time = date('Y-m-d');
        $res = Filesystem::putFile( 'upload/base/'.$time, $file, 'uniqid');
        return $domain.'/storage/'.$res;
    }
    /**
    * 上传到Oss
    * @return \think\Response
    */
    public function uploadOss($storage,$file)
    {
        $accessKeyId      = $storage['oss_id'];
            $accessKeySecret  = $storage['oss_secret'];
            $endpoint  = $storage['oss_endpoint'];
            $bucket = $storage['oss_bucket'];
            try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            // 设置Socket层传输数据的超时时间
            $ossClient->setTimeout(3600);
            // 设置建立连接的超时时间,单位秒,默认10秒。
            $ossClient->setConnectTimeout(10);
            // $bucketExist = $ossClient->doesBucketExist($bucket);  //判断bucket是否存在
            // if (!$bucketExist) {
            //  $ossClient->createBucket($bucketName, \OSS\OssClient::OSS_ACL_TYPE_PUBLIC_READ);
            // }
                $imgTruePath = $file->getPathname(); //获取临时地址
                $ext = $file->extension(); //获取后缀
            $minType = $file->getMime(); //获取文件类型
                $fileName = $file->getOriginalName();
                $filePath = 'base/'.uniqid('base_').'.'.$ext;
            $uploadOssRes = $ossClient->uploadFile($bucket, $filePath, $imgTruePath);
            $url = $uploadOssRes['info']['url'];
            return $url;
            } catch (OssException $e) {
            print $e->getDetails();  //调试时,打开,输出错误信息
            return 'error';
            }
    }
    /**
    * 上传到Cos
    * @return \think\Response
    */
    public function uploadCos($storage,$file)
    {
        $secretId = $storage['cos_secretId']; 
        $secretKey = $storage['cos_secretKey']; 
        $endpoint = $storage['cos_endpoint'];
        $bucket = $storage['cos_bucket'];
        $regionArr =  explode('.', $endpoint);
        $region = $regionArr[2]; 
        $cosClient = new Client(
            array(
                'region' => $region,
                'schema' => 'https', //协议头部,默认为http
                'credentials'=> array(
                    'secretId'  => $secretId ,
                    'secretKey' => $secretKey)));
        $imgTruePath = $file->getPathname(); //获取临时地址
        $ext = $file->extension(); //获取后缀
        $minType = $file->getMime(); //获取文件类型
        $fileName = $file->getOriginalName();
        $filePath = 'base/'.uniqid('base_').'.'.$ext;
        try {
            $result = $cosClient->putObject(
                array(
                    'Bucket' => $bucket,
                    'Key' => $filePath,
                    'Body' => fopen($imgTruePath, 'rb')
                )
            );
            $url = "https://".$result['Location'];
            return $url;
        }catch (\Exception $e) {  
            return 'error';
        }
    }
    /**
    * 上传到kodo 七牛云
    * @return \think\Response
    */
    public function uploadKodo($storage,$file)
    {
        $accessKey = $storage['kodo_key'];
        $secretKey = $storage['kodo_secret'];
        $bucket = $storage['kodo_bucket'];
        $auth = new Auth($accessKey, $secretKey);
        $token = $auth->uploadToken($bucket);
        $imgTruePath = $file->getPathname(); //获取临时地址
        $ext = $file->extension(); //获取后缀
        $minType = $file->getMime(); //获取文件类型
        $fileName = $file->getOriginalName();
        $filePath = 'base/'.uniqid('base_').'.'.$ext;
        $uploadMgr = new UploadManager();
        list($ret, $err) = $uploadMgr->putFile($token, $filePath, $imgTruePath);
        if ($err !== null) {
            return 'error';
        } else {
            return 'http://' . $storage['kodo_domain'] . '/' . $ret['key'];
        }
    }
}</code></pre>
<p>2.获取云存储配置BaseModel.php部分(云存储配置表:kt_base_storage_config)</p>
<pre><code class="language-php">    /**
     * 获取 云存储配置,
     * @param $uid 账户id
     * @return 
     */
    static public function getStorageInfo($uid=''){
        $uid = $uid ?: Session::get('uid');
        $res = Db::table('kt_base_storage_config')->field('uid,type,oss_id,oss_secret,oss_endpoint,oss_bucket,cos_secretId,cos_secretKey,cos_bucket,cos_endpoint,kodo_key,kodo_secret,kodo_domain,kodo_bucket')->where('uid',$uid)->find();
        if(!$res){
            $user = Db::table('kt_base_agent')->find($uid);
            if($user['isadmin'] == 1) return $res;
            $res = self::getStorageInfo($user['pid']);
        }
        return $res;
    }</code></pre>