Upload.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. /**
  3. * lvzheAdmin [a web admin based ThinkPHP5]
  4. * @author xiekunyu<raingad@foxmail.com>
  5. */
  6. namespace app\common\controller;
  7. use app\BaseController;
  8. use app\enterprise\model\{File as FileModel,Message,User};
  9. use app\manage\model\{Config};
  10. use think\facade\Filesystem;
  11. use think\facade\Request;
  12. use think\File;
  13. class Upload extends BaseController
  14. {
  15. protected $middleware = ['checkAuth'];
  16. protected $disk='';
  17. protected $url='';
  18. public function __construct()
  19. {
  20. parent::__construct(app());
  21. $this->disk=env('filesystem.driver','local');
  22. $this->url=getDiskUrl().'/';
  23. }
  24. /**
  25. * 文件上传
  26. */
  27. public function upload($data,$path,$prefix = "",$fileObj = true)
  28. {
  29. $message=$data['message'] ?? '';
  30. if($message){
  31. $message=json_decode($message,true);
  32. }
  33. $uid=request()->userInfo['user_id'];
  34. if($fileObj){
  35. $filePath = $path;
  36. }else{
  37. $filePath = new File($path);
  38. }
  39. $info=$this->getFileInfo($filePath,$path,$fileObj);
  40. if($info['ext']=='' && $message){
  41. $pathInfo = pathinfo($message['fileName'] ?? '');
  42. $info['ext'] = $pathInfo['extension'];
  43. $info['name'] =$message['fileName'] ?? '';
  44. }
  45. $conf=Config::where(['name'=>'fileUpload'])->value('value');
  46. if($conf['size']*1024*1024 < $info['size']){
  47. return shutdown('文件大小超过限制');
  48. }
  49. // 兼容uniapp文件上传
  50. if($info['ext']=='' && isset($data['ext'])){
  51. $info['ext']=$data['ext'];
  52. }
  53. $info['ext']=strtolower($info['ext']);
  54. if(!in_array($info['ext'],$conf['fileExt'])){
  55. return shutdown('文件格式不支持');
  56. }
  57. $fileType=getFileType($info['ext']);
  58. if($fileType==2){
  59. $filecate="image";
  60. }elseif($fileType==3){
  61. $msgType=$message['type'] ?? '';
  62. // 如果是语音消息,类型才为语音,否者为文件,主要是兼容发送音频文件
  63. if($msgType=='voice'){
  64. $filecate="voice";
  65. }else{
  66. $filecate="file";
  67. }
  68. }elseif($fileType==4){
  69. $filecate="video";
  70. }else{
  71. $filecate="file";
  72. }
  73. if(!$prefix){
  74. $prefix=$filecate.'/'.$uid.'/'.date('Y-m-d')."/";
  75. }
  76. $name=str_replace('.'.$info['ext'],'',$info['name']);
  77. $file=FileModel::where(['md5'=>$info['md5']])->find();
  78. // 判断文件是否存在,如果有则不再上传
  79. if(!$file){
  80. $newName = uniqid() . '.' . $info['ext'];
  81. $object = $prefix . $newName;
  82. if($this->disk=='local'){
  83. $object='storage/'.$object;
  84. }
  85. Filesystem::disk($this->disk)->putFileAs($prefix, $filePath, $newName);
  86. }else{
  87. $object = $file['src'];
  88. }
  89. // 把左边的/去掉再加上,避免有些有/有些没有
  90. $object='/'.ltrim($object,'/');
  91. $ret = [
  92. "src" => $object,
  93. "name" => $name,
  94. "cate" => $fileType,
  95. "size" => $info['size'],
  96. "md5" => $info['md5'],
  97. "file_type" => $info['mime'],
  98. "ext" => $info['ext'],
  99. "type" =>2,
  100. 'user_id'=>$uid,
  101. ];
  102. if($message){
  103. // 自动获取视频第一帧,视频并且是使用的阿里云
  104. if($message['type']=='video'){
  105. if($this->disk=='aliyun'){
  106. $message['extends']['poster']=$this->url.$ret['src'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png';
  107. }else{
  108. $message['extends']['poster']='https://im.file.raingad.com/static/image/video.png';
  109. }
  110. }
  111. // 如果发送的文件是图片、视频、音频则将消息类型改为对应的类型
  112. if(in_array($fileType,[2,3,4])){
  113. $message['type']=$filecate;
  114. }
  115. if($message['type']=='image'){
  116. $extends=$this->getImageSizeInfo($info['path']);
  117. $message['extends']=$extends;
  118. }
  119. $newFile=new FileModel;
  120. // 录音就不保存了
  121. if($message['type']!='voice'){
  122. $newFile->save($ret);
  123. }
  124. $message['content']=$ret['src'];
  125. $message['file_id']=$newFile->file_id ?? 0;
  126. $message['file_cate']=$fileType;
  127. $message['file_size']=$info['size'];
  128. $message['file_name']= $name.'.'.$info['ext'];
  129. $message['user_id']= $uid;
  130. $data=Message::sendMessage($message);
  131. return $data;
  132. }else{
  133. return $ret;
  134. }
  135. }
  136. // 上传一般文件
  137. public function uploadFile(){
  138. $param=$this->request->param();
  139. try{
  140. $file=request()->file('file');
  141. $info=$this->upload($param,$file);
  142. return success("上传成功",$info);
  143. } catch(\Exception $e) {
  144. return error($e->getMessage());
  145. }
  146. }
  147. // 获取上传文件的信息
  148. protected function getFileInfo($file,$path,$isObj=false){
  149. $info= [
  150. 'path'=>$file->getRealPath(),
  151. 'size'=>$file->getSize(),
  152. 'mime'=>$file->getMime(),
  153. 'ext'=>$file->extension(),
  154. 'md5'=>$file->md5(),
  155. ];
  156. if($isObj){
  157. $info['name']=$file->getOriginalName();
  158. }else{
  159. // 根据路径获取文件名
  160. $pathInfo = pathinfo($path);
  161. $info['name'] = $pathInfo['basename'];
  162. }
  163. return $info;
  164. }
  165. // 上传图片
  166. public function uploadImage(){
  167. $param=request::param();
  168. try{
  169. $file=request()->file('file');
  170. $info=$this->upload($param,$file,'image/'.date('Y-m-d').'/');
  171. $url=$this->url.$info['src'];
  172. return success("上传成功",$url);
  173. } catch(\Exception $e) {
  174. return error($e->getMessage());
  175. }
  176. }
  177. // 普通上传头像
  178. public function uploadAvatar(){
  179. $param=request::param();
  180. try{
  181. $file=request()->file('file');
  182. $uid=request()->userInfo['user_id'];
  183. $info=$this->upload($param,$file,'avatar/'.$uid.'/');
  184. User::where(['user_id'=>$uid])->update(['avatar'=>$info['src']]);
  185. $url=$this->url.$info['src'];
  186. return success("上传成功",$url);
  187. } catch(\Exception $e) {
  188. return error($e->getMessage());
  189. }
  190. }
  191. // 服务器上传头像
  192. public function uploadLocalAvatar($file,$param,$uid){
  193. try{
  194. $info=$this->upload($param,$file,'avatar/'.$uid.'/',false);
  195. return $info['src'];
  196. } catch(\Exception $e) {
  197. return $e->getMessage().$e->getLine();
  198. }
  199. }
  200. // 获取图片的尺寸
  201. protected function getImageSizeInfo($file){
  202. $extends=[];
  203. // 如果图片获取图片的尺寸
  204. $imageSize = getimagesize($file);
  205. $extends['width']=$imageSize[0];
  206. $extends['height']=$imageSize[1];
  207. // 如果宽大于高则为横图,宽度填充模式,否则为竖图,高度填充模式
  208. if($imageSize[0]>=$imageSize[1]){
  209. $extends['fixMode']=1; // 宽度填充
  210. }else{
  211. $extends['fixMode']=2; // 高度填充
  212. }
  213. if($imageSize[0]<200 && $imageSize[1]<240){
  214. $extends['fixMode']=3; // 小图
  215. }
  216. return $extends;
  217. }
  218. }