Files
jianfeng-server/app/Common/Upload.php
2025-10-02 10:33:06 +08:00

359 lines
12 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\Common;
use app\common\model\CoreAttachment;
use OSS\Core\OssException;
use think\helper\Arr;
use think\Request;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use think\Image;
use Qcloud\Cos\Client;
use think\Session;
use think\facade\Db;
use think\facade\Filesystem;
class Upload {
protected $request;
protected $config;//配置
protected $uniacid;
protected $path_type;//图片 音频 视频
protected $attachment_model;
protected $is_weiqin = false;
/**
* 架构函数
* @param Request $request Request对象
* @access public
*/
public function __construct($uniacid = '7777')
{
$this->uniacid = $uniacid;
$this->config = longbingGetOssConfig($uniacid);
$this->is_weiqin = longbingIsWeiqin();
}
//上传
public function upload($type ,$file,$config=array())
{
if(!empty($config)){
$this->config = $config;
}
$base_path = '/';
$type_data = 1;
switch($type)
{
//图片
case 'picture':
$base_path = $base_path . 'image/';
$type_data = 1;
break;
//音频
case 'audio':
$base_path = $base_path . 'audio/';
$type_data = 2;
break;
//视频
case 'video':
$base_path = $base_path . 'video/';
$type_data = 3;
break;
//证书
case 'cert':
$base_path = $base_path . 'cert/';
$type_data = 4;
break;
//证书
case 'wxuploadkey':
$base_path = $base_path . 'wxuploadkey/';
$type_data = 4;
break;
default:
$base_path = $base_path . 'image/';
$type_data = 1;
break;
}
//根据时间生成路径
$base_path = $base_path . $this->uniacid . '/' . date('y') . '/' . date('m');
$info = null;
$upload_status = false;
// dump($this->checkFile($type ,$file));exit;
//数据检查
if($this->checkFile($type ,$file))
{
$file_name = null;
//本地保存
if(in_array($type, ['cert','wxuploadkey'])){
$file_name = $this->uniacid . '_' . $file->getOriginalName();
$this->config['open_oss'] = 0;
}
$info_path = $this->fileLoaclSave($base_path ,$file ,$file_name);
//获取数据
$info = $this->fileInfo($info_path ,$file->getOriginalName() ,$type_data);
//云服务器上传
if(isset($this->config['open_oss']))
{
switch($this->config['open_oss'])
{
//本地
case 0:
$upload_status = true;
$info['longbing_driver'] = 'loacl';
break;
case 1:
$oss_res = $this->aliyunUpload($info_path);
if(isset($this->config['aliyun_base_dir']) && !empty($this->config['aliyun_base_dir'])) $info_path = $this->config['aliyun_base_dir'] . '/' . $info_path;
if(in_array(substr($info_path,0,1) ,['/' ,"/"])) {
$info_path = substr($info_path,1,(strlen($info_path)-1));
}
$info['attachment'] = $info_path;
$info['longbing_driver'] = 'aliyun';
if(isset($oss_res['info']['url'])) $upload_status = true;
break;
case 2:
$oss_res = $this->qiniuUpload($info_path);
$info['longbing_driver'] = 'qiniuyun';
if(!empty($oss_res) && empty($oss_res[1])) $upload_status = true;
break;
case 3:
$oss_res = $this->tenxunUpoload($info_path);
$info['longbing_driver'] = 'tengxunyun';
if(isset($oss_res['ETag']) && isset($oss_res['ObjectURL'])) $upload_status = true;
break;
default:
$info['longbing_driver'] = 'loacl';
$upload_status = true;
break;
}
}else{
$upload_status = true;
$info['longbing_driver'] = 'loacl';
}
}
if(!$upload_status) $info = null;
// dump($info);exit;
return $info;
}
//检查上传
public function uploadFile($info_path){
$info = [];
$upload_status = false;
if(isset($this->config['open_oss']))
{
switch($this->config['open_oss'])
{
//本地
case 0:
$upload_status = true;
$info['longbing_driver'] = 'loacl';
break;
case 1:
$oss_res = $this->aliyunUpload($info_path);
if(isset($this->config['aliyun_base_dir']) && !empty($this->config['aliyun_base_dir'])) $info_path = $this->config['aliyun_base_dir'] . '/' . $info_path;
if(in_array(substr($info_path,0,1) ,['/' ,"/"])) {
$info_path = substr($info_path,1,(strlen($info_path)-1));
}
$info['attachment'] = $info_path;
$info['longbing_driver'] = 'aliyun';
if(isset($oss_res['info']['url'])) $upload_status = true;
break;
case 2:
$oss_res = $this->qiniuUpload($info_path);
$info['longbing_driver'] = 'qiniuyun';
if(empty($oss_res[1])) $upload_status = true;
break;
case 3:
$oss_res = $this->tenxunUpoload($info_path);
$info['longbing_driver'] = 'tengxunyun';
if(isset($oss_res['ETag']) && isset($oss_res['ObjectURL'])) $upload_status = true;
break;
default:
$info['longbing_driver'] = 'loacl';
$upload_status = true;
break;
}
}else{
$upload_status = true;
$info['longbing_driver'] = 'loacl';
}
return $upload_status;
}
//检查
public function checkFile($type ,$file)
{
$result = false;
switch($type)
{
case 'picture':
$result = validate(['image'=>'filesize:2097152|fileExt:jpg,jpeg,bmp,png|image:*'])->check([$file]);
break;
case 'audio':
$result = validate(['audio'=>'filesize:2097152|fileExt:mp3,wma,wav,m4a'])->check([$file]);
break;
case 'video':
$result = validate(['video'=>'filesize:2097152|fileExt:wmv,mp4,avi,mpg,rmvb'])->check([$file]);
break;
case 'cert':
$result = validate(['cert'=>'filesize:2097152|fileExt:cert'])->check([$file]);
break;
case 'wxuploadkey':
$result = validate(['cert'=>'filesize:2097152|fileExt:cert'])->check([$file]);
break;
default:
break;
}
return $result;
}
//生成返回数据
public function fileInfo($path ,$file_name ,$type_data)
{
$result = array(
'attachment' => ltrim($path,'/'),
'uniacid' => $this->config['uniacid'],
'filename' => $file_name,
'createtime' => time(),
'type' => $type_data
);
return $result;
}
//本地保存
public function fileLoaclSave($path ,$file ,$file_name = null)
{
if(empty($file_name)) $file_name = uuid() . '.' . $file->getOriginalExtension();
// dump($path ,$file ,$file_name);exit;
//保存
$info = Filesystem::disk('longbing')->putFileAs($path ,$file ,$file_name);
return $info;
}
//阿里云上传
public function aliyunUpload($path)
{
//左边的/去掉
$path = ltrim($path,'/');
try{
$bucket = $this->config['aliyun_bucket'];
$filePath = FILE_UPLOAD_PATH . $path;
if(isset($this->config['aliyun_base_dir']) && !empty($this->config['aliyun_base_dir'])) $path = $this->config['aliyun_base_dir'] . '/' . $path;
if(in_array(substr($path,0,1) ,['/' ,"/"])) {
$path = substr($path,1,(strlen($path)-1));
}
if (file_exists($filePath)) {
//实例化OSS
require_once dirname(__FILE__) . '/extend/aliyuncs/oss-sdk-php/autoload.php';
$ossClient =new \OSS\OssClient($this->config['aliyun_access_key_id']
,$this->config['aliyun_access_key_secret']
,$this->config['aliyun_endpoint']);
//uploadFile的上传方法
$res=$ossClient->uploadFile($bucket, $path, $filePath);
if(is_file($filePath)){
unlink($filePath);
}
return $res;
}
}catch(OssException $e) {
//如果出错这里返回报错信息
return false;
//return $e->getMessage();
}
//否则,完成上传操作
return false;
}
//七牛云上传
public function qiniuUpload($path)
{
try{
//加载驱动
require_once dirname(__FILE__) . '/extend/qiniu/autoload.php';
//左边的/去掉
$path = ltrim($path,'/');
// 需要填写你的 Access Key 和 Secret Key
$accessKey = $this->config['qiniu_accesskey'];
$secretKey = $this->config['qiniu_secretkey'];
$bucket = $this->config['qiniu_bucket'];
// 构建鉴权对象
$auth = new Auth($accessKey, $secretKey);
// 生成上传 Token
$token = $auth->uploadToken($bucket);
//获取本地文件
$filePath = FILE_UPLOAD_PATH . $path;
//上传
$client = new UploadManager();
list($ret, $err) = $client->putFile($token, $path, $filePath);
if(is_file($filePath)){
unlink($filePath);
}
return array($ret,$err);
}catch (\Exception $e){
return false;
}
}
//腾讯云上传
public function tenxunUpoload($path)
{
try{
$path = ltrim($path,'/');//左边的/去掉
//加载驱动
require dirname(__FILE__) . '/extend/tencentcloud/vendor/autoload.php';
// dump(dirname(__FILE__) . '/extend/tencentcloud/vendor/autoload.php');exit;
// 需要填写你的 Access Key 和 Secret Key
$appid = $this->config['tenxunyun_appid'];
$secretid = $this->config['tenxunyun_secretid'];
$secretkey= $this->config['tenxunyun_secretkey'];
$bucket = $this->config['tenxunyun_bucket'];
$region = $this->config['tenxunyun_region'];
$yuming = $this->config['tenxunyun_yuming'];
//初始化对象
$cosClient = new Client(array(
'region' => $region, #地域如ap-guangzhou,ap-beijing-1
'credentials' => array(
'secretId' => $secretid,
'secretKey'=> $secretkey,
),
));
// 若初始化 Client 时未填写 appId则 bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
// $bucket = $bucket . '-' . $appid;
// 要上传文件的本地路径
$body = FILE_UPLOAD_PATH . $path;
try {
$result = $cosClient->putObject(array(
'Bucket' => $bucket,
'Key' => $path,
'Body' => file_get_contents($body)
));
if(is_file($body)){
unlink($body);
}
return $result;
} catch (\Exception $e) {
return false;
}
}catch(\Exception $e){
return false;
}
}
}