From 6a5ac8beffc97269b646ddafbda9284ddb01d7c8 Mon Sep 17 00:00:00 2001 From: xucong <850806214@qq.com> Date: Tue, 13 May 2025 11:36:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=8F=90=E4=BA=A4=E7=BC=BA=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/controller/FileController.php | 53 ++++ app/common.php | 15 + app/common/model/file/File.php | 4 + app/common/service/FileServer.php | 434 ++++++++++++++++++++++++++ 4 files changed, 506 insertions(+) create mode 100644 app/api/controller/FileController.php create mode 100644 app/common/service/FileServer.php diff --git a/app/api/controller/FileController.php b/app/api/controller/FileController.php new file mode 100644 index 0000000..0b55a3a --- /dev/null +++ b/app/api/controller/FileController.php @@ -0,0 +1,53 @@ +userId); + if($data['cd'] == 0){ + $this->success("操作成功",$data); + }else{ + $this->fail("操作失败"); + } + + } +} \ No newline at end of file diff --git a/app/common.php b/app/common.php index f0751ca..beb137d 100755 --- a/app/common.php +++ b/app/common.php @@ -62,7 +62,22 @@ function compare_php(string $version) : bool return version_compare(PHP_VERSION, $version) >= 0 ? true : false; } +function check_is_image($image) : bool +{ + try { + if (function_exists('exif_imagetype')) { + $ImageType = exif_imagetype($image); + } else { + $info = getimagesize($image); + $ImageType = $info ? $info[2] : false; + } + } catch (\Exception $e) { + return false; + } + + return in_array($ImageType, [1, 2, 3, 6]); +} /** * @notes 检查文件是否可写 * @param string $dir diff --git a/app/common/model/file/File.php b/app/common/model/file/File.php index 558b118..843c8d2 100755 --- a/app/common/model/file/File.php +++ b/app/common/model/file/File.php @@ -19,6 +19,10 @@ use think\model\concern\SoftDelete; class File extends BaseModel { + const type_other = 0;//其他 + const type_image = 1;//图片 + const type_video = 2;//视频 + use SoftDelete; protected $deleteTime = 'delete_time'; } \ No newline at end of file diff --git a/app/common/service/FileServer.php b/app/common/service/FileServer.php new file mode 100644 index 0000000..98c2017 --- /dev/null +++ b/app/common/service/FileServer.php @@ -0,0 +1,434 @@ + ConfigServer::get('storage', 'default', 'local'), + 'engine' => ConfigServer::get('storage_engine') + ]; + + if (empty($config['engine']['local'])) { + $config['engine']['local'] = []; + } + + $StorageDriver = new StorageDriver($config); + $StorageDriver->setUploadFile('file'); + + // 验证是否是图片文件 + if (! check_is_image($StorageDriver->getFileInfo()['tmp_name'] ?? '')) { + throw new Exception('不是有效的图像文件'); + } + + if (!$StorageDriver->upload($save_dir)) { + throw new Exception('图片上传失败' . $StorageDriver->getError()); + } + + // 图片上传路径 + $fileName = $StorageDriver->getFileName(); + // 图片信息 + $fileInfo = $StorageDriver->getFileInfo(); + + //名字长度太长 + if (strlen($fileInfo['name']) > 128) { + $file_name = substr($fileInfo['name'], 0, 123); + $file_end = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name'])); + $fileInfo['name'] = $file_name.$file_end; + } + + // 记录图片信息 + $data = [ + 'cate_id' => $cate_id, + 'name' => $fileInfo['name'], + 'type' => File::type_image, + 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName), + 'create_time' => time(), + ]; + Db::name('file')->insert($data); + return self::dataSuccess('上传文件成功', $data); + + } catch (\Exception $e) { + $message = lang($e->getMessage()) ?? $e->getMessage(); + return self::dataError('上传文件失败:' . $message); + } + } + + /** + * Notes: 用户上传图片 + * @param $user_id (用户ID) + * @param string $save_dir (保存目录, 不建议修改, 不要超二级目录) + * @return array + * @author 张无忌(2021/2/20 9:53) + */ + public static function userFormImage($user_id = 0, $save_dir='uploads/user') + { + try { + $config = [ + 'default' => ConfigServer::get('storage', 'default', 'local'), + 'engine' => ConfigServer::get('storage_engine') + ]; + + if (empty($config['engine']['local'])) { + $config['engine']['local'] = []; + } + + + $StorageDriver = new StorageDriver($config); + $StorageDriver->setUploadFile('file'); + $fileName = $StorageDriver->getFileName(); + $fileInfo = $StorageDriver->getFileInfo(); + + // 验证是否是图片文件 + if (! check_is_image($StorageDriver->getFileInfo()['tmp_name'] ?? '')) { + throw new Exception('不是有效的图像文件'); + } + + // 校验上传文件后缀 + $ext = pathinfo($fileInfo['name'], PATHINFO_EXTENSION); + if (!in_array(strtolower($ext), config('project.file_image'))) { + throw new Exception("上传图片不允许上传{$ext}文件"); + } + + // 上传文件 + $save_dir = $save_dir . '/' . date('Ymd'); + if (!$StorageDriver->upload($save_dir)) { + throw new Exception($StorageDriver->getError()); + } + + // 记录图片信息 + $data = [ + 'user_id' => $user_id ? $user_id : 0, + 'name' => $fileInfo['name'], + 'type' => File::type_image, + 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName), + 'create_time' => time(), + ]; + Db::name('user_file')->insert($data); + + $result['url'] = UrlServer::getFileUrl($data['uri']); + $result['base_url'] = $data['uri']; + $result['name'] = $data['name']; + $result['cd'] = 1; + return $result; + + } catch (\Exception $e) { + $result['cd'] = 0; + return $result; +// $message = lang($e->getMessage()) ?? $e->getMessage(); +// return self::setError('上传文件失败:' . $message); + } + } + + /** + * Notes: 上传视频 + * @param string $save_dir (保存目录, 不建议修改, 不要超二级目录) + * @return array + * @author 张无忌(2021/2/20 9:53) + */ + public static function video($save_dir='uploads/video') + { + try { + $config = [ + 'default' => ConfigServer::get('storage', 'default', 'local'), + 'engine' => ConfigServer::get('storage_engine') + ]; + + if (empty($config['engine']['local'])) { + $config['engine']['local'] = []; + } + + $StorageDriver = new StorageDriver($config); + $StorageDriver->setUploadFile('file'); + $fileName = $StorageDriver->getFileName(); + $fileInfo = $StorageDriver->getFileInfo(); + + // 验证是否是视频 + if (! check_is_video($StorageDriver->getFileInfo()['tmp_name'] ?? '')) { + throw new Exception('不是有效的视频文件'); + } + + // 校验上传文件后缀 + $ext = pathinfo($fileInfo['name'], PATHINFO_EXTENSION); + if (!in_array(strtolower($ext), config('project.file_video'))) { + throw new Exception("上传视频不允许上传{$ext}文件"); + } + + // 上传文件 + $save_dir = $save_dir . '/' . date('Ymd'); + if (!$StorageDriver->upload($save_dir)) { + throw new Exception($StorageDriver->getError()); + } + + // 记录图片信息 + $data = [ + 'name' => $fileInfo['name'], + 'type' => File::type_video, + 'domain' => UrlServer::getFileUrl('/'), + 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName), + 'create_time' => time(), + ]; + return self::dataSuccess('上传文件成功', $data); + + } catch (\Exception $e) { + $message = lang($e->getMessage()) ?? $e->getMessage(); + return self::dataError('上传文件失败:' . $message); + } + } + + /** + * Notes: 用户上传图片 + * @param string $save_dir (保存目录, 不建议修改, 不要超二级目录) + * @param bool $isLocal (是否存不使用oss 只存本地, 上传退款证书会用到) + * @return array + * @author 张无忌(2021/2/20 9:53) + */ + public static function other($save_dir='uploads/other', $isLocal=false ) + { + try { + if ($isLocal == false) { + $config = [ + 'default' => ConfigServer::get('storage', 'default', 'local'), + 'engine' => ConfigServer::get('storage_engine') + ]; + } else { + $config = [ + 'default' => 'local', + 'engine' => ConfigServer::get('storage_engine') + ]; + } + if (empty($config['engine']['local'])) { + $config['engine']['local'] = []; + } + + $StorageDriver = new StorageDriver($config); + $StorageDriver->setUploadFile('file'); + + if (!$StorageDriver->upload($save_dir)) { + throw new Exception('上传失败' . $StorageDriver->getError()); + } + + // 图片上传路径 + $fileName = $StorageDriver->getFileName(); + // 图片信息 + $fileInfo = $StorageDriver->getFileInfo(); + + // 信息 + $data = [ + 'name' => $fileInfo['name'], + 'type' => File::type_other, + 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName), + 'create_time' => time(), + ]; + Db::name('file')->insert($data); + return self::dataSuccess('上传文件成功', $data); + + } catch (\Exception $e) { + $message = lang($e->getMessage()) ?? $e->getMessage(); + return self::dataError('上传文件失败:' . $message); + } + } + + /** + * Notes: 文件列表 + * @param $pag_no + * @param $page_size + * @param int $cate_id + * @param string $type + * @author 张无忌(2021/2/20 10:23) + * @return array + */ + public static function lists($pag_no, $page_size, $cate_id = 0, $type = '') + { + try { + $where[] = ['del', '=', 0]; + if ($type) { + $where[] = ['type', '=', $type]; + } + if (!empty($cate_id) and $cate_id > 0) { + $lists = Db::name('file_cate')->where(['del' => 0])->select(); + $lists = !empty($lists) ? $lists : []; + $childs = self::getChildCid($lists, $cate_id, true); + array_push($childs, $cate_id); + $where[] = ['cate_id', 'in', $childs]; + } + + $lists = Db::name('file') + ->field(['name', 'uri', 'id']) + ->withAttr('uri', function ($value) { + return UrlServer::getFileUrl($value); + }) + ->where($where) + ->order(['id' => 'desc']) + ->paginate([ + 'page' => $pag_no, + 'list_rows' => $page_size, + 'var_page' => 'page' + ])->toArray(); + + return $lists; + + } catch (\Exception $e) { + return []; + } + } + + /** + * Notes: 删除选中的图片 + * @param $ids + * @author 张无忌(2021/2/20 10:24) + * @return bool|int|string + */ + public static function del($ids) + { + try { + return Db::name('file') + ->where('id', 'in', $ids) + ->update(['del' => 1]); + } catch (\Exception $e) { + return false; + } + } + + public static function videokkk($save_dir = '',$ext = 'mp3,mp4,wav,AVI,mov,rmvb,rm,FLV,3GP'){ + try { + if (!file_exists($save_dir)) { + mkdir($save_dir, 0775, true); + } + + $file = request()->file('file'); + $info = $file->validate(['ext' => $ext])->move($save_dir); + + if(empty($info)){ + throw new Exception($file->getError()); + } + + $result['url'] = $save_dir . '/' . $info->getSaveName(); + $result['name'] = $info->getSaveName(); + $result['save_name'] = $info->getFilename(); + $file_data = $info->getInfo(); + if (isset($file_data['name'])){ + $result['name'] = $file_data['name']; + } + return self::dataSuccess('上传文件成功', $result); + + } catch (Exception $e) { + $messge = $e->getMessage(); + $messge = lang($messge) ?? $messge; + return self::dataError('上传文件失败:' . $messge); + } + } + + public static function videoNew($cate_id, $save_dir='uploads/video') + { + try { + $config = [ + 'default' => ConfigServer::get('storage', 'default', 'local'), + 'engine' => ConfigServer::get('storage_engine') + ]; + + if (empty($config['engine']['local'])) { + $config['engine']['local'] = []; + } + + $StorageDriver = new StorageDriver($config); + $StorageDriver->setUploadFile('file'); + + if (!$StorageDriver->upload($save_dir)) { + throw new Exception('视频上传失败' . $StorageDriver->getError()); + } + + // 视频上传路径 + $fileName = $StorageDriver->getFileName(); + // 视频信息 + $fileInfo = $StorageDriver->getFileInfo(); + + //名字长度太长 + if (strlen($fileInfo['name']) > 128) { + $file_name = substr($fileInfo['name'], 0, 123); + $file_end = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name'])); + $fileInfo['name'] = $file_name.$file_end; + } + + // 记录视频信息 + $data = [ + 'cate_id' => $cate_id, + 'name' => $fileInfo['name'], + 'type' => File::type_video, + 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName), + 'create_time' => time(), + ]; + Db::name('file')->insert($data); + return self::dataSuccess('上传视频成功', $data); + + } catch (\Exception $e) { + $message = lang($e->getMessage()) ?? $e->getMessage(); + return self::dataError('上传视频失败:' . $message); + } + } + + + + + /** + * @notes 获取后代分类 + * @param $lists + * @param $cid + * @param $clear + * @return array + * @author 段誉 + * @date 2022/3/22 14:29 + */ + public static function getChildCid($lists, $cid, $clear) + { + static $temp = []; + if($clear) { + $temp = []; + } + foreach($lists as $item) { + if($item['pid'] == $cid) { + $temp[] = $item['id']; + self::getChildCid($lists, $item['id'], false); + } + } + return $temp; + } +} \ No newline at end of file