123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <?php
- /**
- * lvzheAdmin [a web admin based ThinkPHP5]
- * @author xiekunyu<raingad@foxmail.com>
- */
- namespace app\common\controller;
- use app\BaseController;
- use app\enterprise\model\{File as FileModel,Message,User};
- use app\manage\model\{Config};
- use think\facade\Filesystem;
- use think\facade\Request;
- use think\File;
- class Upload extends BaseController
- {
- protected $middleware = ['checkAuth'];
- protected $disk='';
- protected $url='';
- public function __construct()
- {
- parent::__construct(app());
- $this->disk=env('filesystem.driver','local');
- $this->url=getDiskUrl().'/';
-
- }
- /**
- * 文件上传
- */
- public function upload($data,$path,$prefix = "",$fileObj = true)
- {
- $message=$data['message'] ?? '';
- if($message){
- $message=json_decode($message,true);
- }
- $uid=request()->userInfo['user_id'];
- if($fileObj){
- $filePath = $path;
- }else{
- $filePath = new File($path);
- }
- $info=$this->getFileInfo($filePath,$path,$fileObj);
- if($info['ext']=='' && $message){
- $pathInfo = pathinfo($message['fileName'] ?? '');
- $info['ext'] = $pathInfo['extension'];
- $info['name'] =$message['fileName'] ?? '';
- }
- $conf=Config::where(['name'=>'fileUpload'])->value('value');
- if($conf['size']*1024*1024 < $info['size']){
- return shutdown('文件大小超过限制');
- }
- // 兼容uniapp文件上传
- if($info['ext']=='' && isset($data['ext'])){
- $info['ext']=$data['ext'];
- }
- $info['ext']=strtolower($info['ext']);
- if(!in_array($info['ext'],$conf['fileExt'])){
- return shutdown('文件格式不支持');
- }
- $fileType=getFileType($info['ext']);
- if($fileType==2){
- $filecate="image";
- }elseif($fileType==3){
- $msgType=$message['type'] ?? '';
- // 如果是语音消息,类型才为语音,否者为文件,主要是兼容发送音频文件
- if($msgType=='voice'){
- $filecate="voice";
- }else{
- $filecate="file";
- }
- }elseif($fileType==4){
- $filecate="video";
- }else{
- $filecate="file";
- }
- if(!$prefix){
- $prefix=$filecate.'/'.$uid.'/'.date('Y-m-d')."/";
- }
- $name=str_replace('.'.$info['ext'],'',$info['name']);
- $file=FileModel::where(['md5'=>$info['md5']])->find();
- // 判断文件是否存在,如果有则不再上传
- if(!$file){
- $newName = uniqid() . '.' . $info['ext'];
- $object = $prefix . $newName;
- if($this->disk=='local'){
- $object='storage/'.$object;
- }
- Filesystem::disk($this->disk)->putFileAs($prefix, $filePath, $newName);
- }else{
- $object = $file['src'];
- }
- // 把左边的/去掉再加上,避免有些有/有些没有
- $object='/'.ltrim($object,'/');
- $ret = [
- "src" => $object,
- "name" => $name,
- "cate" => $fileType,
- "size" => $info['size'],
- "md5" => $info['md5'],
- "file_type" => $info['mime'],
- "ext" => $info['ext'],
- "type" =>2,
- 'user_id'=>$uid,
- ];
-
- if($message){
- // 自动获取视频第一帧,视频并且是使用的阿里云
- if($message['type']=='video'){
- if($this->disk=='aliyun'){
- $message['extends']['poster']=$this->url.$ret['src'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png';
- }else{
- $message['extends']['poster']='https://im.file.raingad.com/static/image/video.png';
- }
- }
- // 如果发送的文件是图片、视频、音频则将消息类型改为对应的类型
- if(in_array($fileType,[2,3,4])){
- $message['type']=$filecate;
- }
- if($message['type']=='image'){
- $extends=$this->getImageSizeInfo($info['path']);
- $message['extends']=$extends;
- }
- $newFile=new FileModel;
- // 录音就不保存了
- if($message['type']!='voice'){
- $newFile->save($ret);
- }
- $message['content']=$ret['src'];
- $message['file_id']=$newFile->file_id ?? 0;
- $message['file_cate']=$fileType;
- $message['file_size']=$info['size'];
- $message['file_name']= $name.'.'.$info['ext'];
- $message['user_id']= $uid;
- $data=Message::sendMessage($message);
- return $data;
- }else{
- return $ret;
- }
-
- }
- // 上传一般文件
- public function uploadFile(){
- $param=$this->request->param();
- try{
- $file=request()->file('file');
- $info=$this->upload($param,$file);
- return success("上传成功",$info);
- } catch(\Exception $e) {
- return error($e->getMessage());
- }
- }
- // 获取上传文件的信息
- protected function getFileInfo($file,$path,$isObj=false){
- $info= [
- 'path'=>$file->getRealPath(),
- 'size'=>$file->getSize(),
- 'mime'=>$file->getMime(),
- 'ext'=>$file->extension(),
- 'md5'=>$file->md5(),
- ];
- if($isObj){
- $info['name']=$file->getOriginalName();
- }else{
- // 根据路径获取文件名
- $pathInfo = pathinfo($path);
- $info['name'] = $pathInfo['basename'];
- }
- return $info;
-
- }
- // 上传图片
- public function uploadImage(){
- $param=request::param();
- try{
- $file=request()->file('file');
- $info=$this->upload($param,$file,'image/'.date('Y-m-d').'/');
- $url=$this->url.$info['src'];
- return success("上传成功",$url);
- } catch(\Exception $e) {
- return error($e->getMessage());
- }
- }
- // 普通上传头像
- public function uploadAvatar(){
- $param=request::param();
- try{
- $file=request()->file('file');
- $uid=request()->userInfo['user_id'];
- $info=$this->upload($param,$file,'avatar/'.$uid.'/');
- User::where(['user_id'=>$uid])->update(['avatar'=>$info['src']]);
- $url=$this->url.$info['src'];
- return success("上传成功",$url);
- } catch(\Exception $e) {
- return error($e->getMessage());
- }
- }
- // 服务器上传头像
- public function uploadLocalAvatar($file,$param,$uid){
- try{
- $info=$this->upload($param,$file,'avatar/'.$uid.'/',false);
- return $info['src'];
- } catch(\Exception $e) {
- return $e->getMessage().$e->getLine();
- }
- }
- // 获取图片的尺寸
- protected function getImageSizeInfo($file){
- $extends=[];
- // 如果图片获取图片的尺寸
- $imageSize = getimagesize($file);
- $extends['width']=$imageSize[0];
- $extends['height']=$imageSize[1];
- // 如果宽大于高则为横图,宽度填充模式,否则为竖图,高度填充模式
- if($imageSize[0]>=$imageSize[1]){
- $extends['fixMode']=1; // 宽度填充
- }else{
- $extends['fixMode']=2; // 高度填充
- }
- if($imageSize[0]<200 && $imageSize[1]<240){
- $extends['fixMode']=3; // 小图
- }
- return $extends;
- }
- }
|