| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- <?php
- // +----------------------------------------------------------------------
- // | likeadmin快速开发前后端分离管理后台(PHP版)
- // +----------------------------------------------------------------------
- // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
- // | 开源版本可自由商用,可去除界面版权logo
- // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
- // | github下载:https://github.com/likeshop-github/likeadmin
- // | 访问官网:https://www.likeadmin.cn
- // | likeadmin团队 版权所有 拥有最终解释权
- // +----------------------------------------------------------------------
- // | author: likeadminTeam
- // +----------------------------------------------------------------------
- namespace app\common\service;
- use app\common\enum\AdminTerminalEnum;
- use app\common\enum\FileEnum;
- use app\common\model\file\File;
- use app\common\model\file\TenantFile;
- use app\common\service\storage\Driver as StorageDriver;
- use Exception;
- class UploadService
- {
- /**
- * @notes 上传图片
- * @param $cid
- * @param int $user_id
- * @param string $saveDir
- * @return array
- * @throws Exception
- * @author 段誉
- * @date 2021/12/29 16:30
- */
- public static function image($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/images')
- {
- try {
- $config = [
- 'default' => ConfigService::get('storage', 'default', 'local'),
- 'engine' => ConfigService::get('storage') ?? ['local'=>[]],
- ];
- // 2、执行文件上传
- $StorageDriver = new StorageDriver($config);
- $StorageDriver->setUploadFile('file');
- $fileName = $StorageDriver->getFileName();
- $fileInfo = $StorageDriver->getFileInfo();
- // 校验上传文件后缀
- if (!in_array(strtolower($fileInfo['ext']), config('project.file_image'))) {
- throw new Exception("上传图片不允许上传". $fileInfo['ext'] . "文件");
- }
- // 上传文件
- $saveDir = self::getUploadUrl($saveDir);
- if (!$StorageDriver->upload($saveDir)) {
- throw new Exception($StorageDriver->getError());
- }
- // 3、处理文件名称
- if (strlen($fileInfo['name']) > 128) {
- $name = substr($fileInfo['name'], 0, 123);
- $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
- $fileInfo['name'] = $name . $nameEnd;
- }
- // 4、写入数据库中
- if(AdminTerminalEnum::isTenant()){
- $file = (new TenantFile())->create([
- 'tenant_id' => request()->tenantId,
- 'cid' => $cid,
- 'type' => FileEnum::IMAGE_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }else{
- $file = (new File())->create([
- 'cid' => $cid,
- 'type' => FileEnum::IMAGE_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }
- // 5、返回结果
- return [
- 'id' => $file['id'],
- 'cid' => $file['cid'],
- 'type' => $file['type'],
- 'name' => $file['name'],
- 'uri' => FileService::getFileUrl($file['uri']),
- 'url' => $file['uri']
- ];
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- /**
- * @notes 视频上传
- * @param $cid
- * @param int $user_id
- * @param string $saveDir
- * @return array
- * @throws Exception
- * @author 段誉
- * @date 2021/12/29 16:32
- */
- public static function video($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/video')
- {
- try {
- $config = [
- 'default' => ConfigService::get('storage', 'default', 'local'),
- 'engine' => ConfigService::get('storage') ?? ['local'=>[]],
- ];
- // 2、执行文件上传
- $StorageDriver = new StorageDriver($config);
- $StorageDriver->setUploadFile('file');
- $fileName = $StorageDriver->getFileName();
- $fileInfo = $StorageDriver->getFileInfo();
- // 校验上传文件后缀
- if (!in_array(strtolower($fileInfo['ext']), config('project.file_video'))) {
- throw new Exception("上传视频不允许上传". $fileInfo['ext'] . "文件");
- }
- // 上传文件
- $saveDir = self::getUploadUrl($saveDir);
- if (!$StorageDriver->upload($saveDir)) {
- throw new Exception($StorageDriver->getError());
- }
- // 3、处理文件名称
- if (strlen($fileInfo['name']) > 128) {
- $name = substr($fileInfo['name'], 0, 123);
- $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
- $fileInfo['name'] = $name . $nameEnd;
- }
- // 4、写入数据库中
- if(AdminTerminalEnum::isTenant()){
- $file = (new TenantFile())->create([
- 'tenant_id' => request()->tenantId,
- 'cid' => $cid,
- 'type' => FileEnum::VIDEO_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }else{
- $file = (new File())->create([
- 'cid' => $cid,
- 'type' => FileEnum::VIDEO_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }
- // 5、返回结果
- return [
- 'id' => $file['id'],
- 'cid' => $file['cid'],
- 'type' => $file['type'],
- 'name' => $file['name'],
- 'uri' => FileService::getFileUrl($file['uri']),
- 'url' => $file['uri']
- ];
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- /**
- * @notes 上传文件
- * @param $cid
- * @param int $sourceId
- * @param int $source
- * @param string $saveDir
- * @return array
- * @throws Exception
- * @author dw
- * @date 2023/06/26
- */
- public static function file($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
- {
- try {
- $config = [
- 'default' => ConfigService::get('storage', 'default', 'local'),
- 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
- ];
- // 2、执行文件上传
- $StorageDriver = new StorageDriver($config);
- $StorageDriver->setUploadFile('file');
- $fileName = $StorageDriver->getFileName();
- $fileInfo = $StorageDriver->getFileInfo();
- // 校验上传文件后缀
- if (!in_array(strtolower($fileInfo['ext']), config('project.file_file'))) {
- throw new Exception("上传文件不允许上传" . $fileInfo['ext'] . "文件");
- }
- // 上传文件
- $saveDir = self::getUploadUrl($saveDir);
- if (!$StorageDriver->upload($saveDir)) {
- throw new Exception($StorageDriver->getError());
- }
- // 3、处理文件名称
- if (strlen($fileInfo['name']) > 128) {
- $name = substr($fileInfo['name'], 0, 123);
- $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
- $fileInfo['name'] = $name . $nameEnd;
- }
- // 4、写入数据库中
- if(AdminTerminalEnum::isTenant()) {
- $file = (new TenantFile())->create([
- 'tenant_id' => request()->tenantId,
- 'cid' => $cid,
- 'type' => FileEnum::FILE_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }else{
- $file = (new File())->create([
- 'cid' => $cid,
- 'type' => FileEnum::FILE_TYPE,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ]);
- }
- // 5、返回结果
- return [
- 'id' => $file['id'],
- 'cid' => $file['cid'],
- 'type' => $file['type'],
- 'name' => $file['name'],
- 'uri' => FileService::getFileUrl($file['uri']),
- 'url' => $file['uri']
- ];
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- public static function base64Image($cid, $base64_image, string $saveDir = 'uploads/signs')
- {
- try {
- // 提取Base64数据,去掉"data:image/png;base64,"前缀
- $base64_image_content = explode(',', $base64_image)[1];
- // 解码Base64数据
- $binary_data = base64_decode($base64_image_content);
- // 指定保存到本地的文件名和路径
- $file_name = 'sign'.time().rand(1000, 9999).".png";
- $file_path = $saveDir.'/'.date('Ymd').'/'.$file_name;
- $dir_name = dirname($file_path); // 获取目录路径
- if (!is_dir($dir_name)) {
- if (mkdir($dir_name, 0755, true)) {
- } else {
- throw new \think\Exception("无法创建目录");
- }
- }
- // 将二进制数据写入文件
- if (!file_put_contents($file_path, $binary_data)) {
- throw new \think\Exception('签名上传失败');
- }
- // 4、写入数据库中
- if(AdminTerminalEnum::isTenant()) {
- $file = (new TenantFile())->create([
- 'tenant_id' => request()->tenantId,
- 'cid' => $cid,
- 'type' => FileEnum::IMAGE_TYPE,
- 'name' => $file_name,
- 'uri' => $file_path,
- 'source_id' => 0,
- 'create_time' => time(),
- ]);
- }else{
- $file = (new File())->create([
- 'cid' => $cid,
- 'type' => FileEnum::IMAGE_TYPE,
- 'name' => $file_name,
- 'uri' => $file_path,
- 'source_id' => 0,
- 'create_time' => time(),
- ]);
- }
- // 5、返回结果
- return [
- 'id' => $file['id'],
- 'cid' => $file['cid'],
- 'type' => $file['type'],
- 'name' => $file['name'],
- 'uri' => FileService::getFileUrl($file['uri']),
- 'url' => $file['uri']
- ];
- //
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- /**
- * @notes 上传地址
- * @param $saveDir
- * @return string
- * @author dw
- * @date 2023/06/26
- */
- private static function getUploadUrl($saveDir):string
- {
- return $saveDir . '/' . date('Ymd');
- }
- /**
- *
- * @param $cid 文件分组ID la_file_cate的分组ID
- * @param int $sourceId 上传的用户ID
- * @param int $source 用户类型,SOURCE_USER
- * @return void
- * @author 林海涛
- * @date 2024/7/19 下午5:02
- */
- public static function uploadFies($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
- {
- try{
- $data =[];
- $config = [
- 'default' => ConfigService::get('storage', 'default', 'local'),
- 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
- ];
- $files = request()->file('files');
- $limit = array_merge(config('project.file_image'), config('project.file_video'), config('project.file_file'));
- foreach($files as $file){
- if (!in_array(strtolower($file->extension()), $limit)) {
- throw new Exception('不允许上传' . $file->extension() . '后缀文件');
- }
- }
- $insertData = [];
- $model = new File();
- $StorageDriver = new StorageDriver($config);
- foreach($files as $file)
- {
- $fileType = '';
- $saveDir = '';
- if (in_array(strtolower($file->extension()), config('project.file_image'))) {
- $fileType = FileEnum::IMAGE_TYPE;
- $saveDir = 'uploads/images';
- } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
- $fileType = FileEnum::VIDEO_TYPE;
- $saveDir = 'uploads/video';
- } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
- $fileType = FileEnum::FILE_TYPE;
- $saveDir = 'uploads/file';
- }
- $StorageDriver->setUploadFile('files',$file->getOriginalName());
- $fileName = $StorageDriver->getFileName();
- $fileInfo = $StorageDriver->getFileInfo();
- $saveDir = self::getUploadUrl($saveDir);
- // 上传文件
- if (!$StorageDriver->upload($saveDir)) {
- throw new Exception($StorageDriver->getError());
- }
- // 3、处理文件名称
- if (strlen($fileInfo['name']) > 128) {
- $name = substr($fileInfo['name'], 0, 123);
- $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
- $fileInfo['name'] = $name . $nameEnd;
- }
- $insertData[] = [
- 'cid' => $cid,
- 'type' => $fileType,
- 'name' => $fileInfo['name'],
- 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
- 'source' => $source,
- 'source_id' => $sourceId,
- 'create_time' => time(),
- ];
- }
- if(!empty($insertData)){
- $modelData = $model->saveAll($insertData);
- $data = [];
- foreach($modelData as $v){
- $data[] = [
- 'id' => $v['id'],
- 'cid' => $v['cid'],
- 'type' => $v['type'],
- 'name' => $v['name'],
- 'uri' => FileService::getFileUrl($v['uri']),
- 'url' => $v['uri']
- ];
- }
- }
- return $data;
- }catch (\Exception $e){
- throw new Exception($e->getMessage());
- }
- }
- }
|