UploadService.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeadmin快速开发前后端分离管理后台(PHP版)
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
  8. // | github下载:https://github.com/likeshop-github/likeadmin
  9. // | 访问官网:https://www.likeadmin.cn
  10. // | likeadmin团队 版权所有 拥有最终解释权
  11. // +----------------------------------------------------------------------
  12. // | author: likeadminTeam
  13. // +----------------------------------------------------------------------
  14. namespace app\common\service;
  15. use app\common\enum\AdminTerminalEnum;
  16. use app\common\enum\FileEnum;
  17. use app\common\model\file\File;
  18. use app\common\model\file\TenantFile;
  19. use app\common\service\storage\Driver as StorageDriver;
  20. use Exception;
  21. class UploadService
  22. {
  23. /**
  24. * @notes 上传图片
  25. * @param $cid
  26. * @param int $user_id
  27. * @param string $saveDir
  28. * @return array
  29. * @throws Exception
  30. * @author 段誉
  31. * @date 2021/12/29 16:30
  32. */
  33. public static function image($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/images')
  34. {
  35. try {
  36. $config = [
  37. 'default' => ConfigService::get('storage', 'default', 'local'),
  38. 'engine' => ConfigService::get('storage') ?? ['local'=>[]],
  39. ];
  40. // 2、执行文件上传
  41. $StorageDriver = new StorageDriver($config);
  42. $StorageDriver->setUploadFile('file');
  43. $fileName = $StorageDriver->getFileName();
  44. $fileInfo = $StorageDriver->getFileInfo();
  45. // 校验上传文件后缀
  46. if (!in_array(strtolower($fileInfo['ext']), config('project.file_image'))) {
  47. throw new Exception("上传图片不允许上传". $fileInfo['ext'] . "文件");
  48. }
  49. // 上传文件
  50. $saveDir = self::getUploadUrl($saveDir);
  51. if (!$StorageDriver->upload($saveDir)) {
  52. throw new Exception($StorageDriver->getError());
  53. }
  54. // 3、处理文件名称
  55. if (strlen($fileInfo['name']) > 128) {
  56. $name = substr($fileInfo['name'], 0, 123);
  57. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
  58. $fileInfo['name'] = $name . $nameEnd;
  59. }
  60. // 4、写入数据库中
  61. $file = (AdminTerminalEnum::isTenant() ? new TenantFile() : new File())->create([
  62. 'cid' => $cid,
  63. 'type' => FileEnum::IMAGE_TYPE,
  64. 'name' => $fileInfo['name'],
  65. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  66. 'source' => $source,
  67. 'source_id' => $sourceId,
  68. 'create_time' => time(),
  69. ]);
  70. // 5、返回结果
  71. return [
  72. 'id' => $file['id'],
  73. 'cid' => $file['cid'],
  74. 'type' => $file['type'],
  75. 'name' => $file['name'],
  76. 'uri' => FileService::getFileUrl($file['uri']),
  77. 'url' => $file['uri']
  78. ];
  79. } catch (Exception $e) {
  80. throw new Exception($e->getMessage());
  81. }
  82. }
  83. /**
  84. * @notes 视频上传
  85. * @param $cid
  86. * @param int $user_id
  87. * @param string $saveDir
  88. * @return array
  89. * @throws Exception
  90. * @author 段誉
  91. * @date 2021/12/29 16:32
  92. */
  93. public static function video($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/video')
  94. {
  95. try {
  96. $config = [
  97. 'default' => ConfigService::get('storage', 'default', 'local'),
  98. 'engine' => ConfigService::get('storage') ?? ['local'=>[]],
  99. ];
  100. // 2、执行文件上传
  101. $StorageDriver = new StorageDriver($config);
  102. $StorageDriver->setUploadFile('file');
  103. $fileName = $StorageDriver->getFileName();
  104. $fileInfo = $StorageDriver->getFileInfo();
  105. // 校验上传文件后缀
  106. if (!in_array(strtolower($fileInfo['ext']), config('project.file_video'))) {
  107. throw new Exception("上传视频不允许上传". $fileInfo['ext'] . "文件");
  108. }
  109. // 上传文件
  110. $saveDir = self::getUploadUrl($saveDir);
  111. if (!$StorageDriver->upload($saveDir)) {
  112. throw new Exception($StorageDriver->getError());
  113. }
  114. // 3、处理文件名称
  115. if (strlen($fileInfo['name']) > 128) {
  116. $name = substr($fileInfo['name'], 0, 123);
  117. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
  118. $fileInfo['name'] = $name . $nameEnd;
  119. }
  120. // 4、写入数据库中
  121. $file = (AdminTerminalEnum::isTenant() ? new TenantFile() : new File())->create([
  122. 'cid' => $cid,
  123. 'type' => FileEnum::VIDEO_TYPE,
  124. 'name' => $fileInfo['name'],
  125. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  126. 'source' => $source,
  127. 'source_id' => $sourceId,
  128. 'create_time' => time(),
  129. ]);
  130. // 5、返回结果
  131. return [
  132. 'id' => $file['id'],
  133. 'cid' => $file['cid'],
  134. 'type' => $file['type'],
  135. 'name' => $file['name'],
  136. 'uri' => FileService::getFileUrl($file['uri']),
  137. 'url' => $file['uri']
  138. ];
  139. } catch (Exception $e) {
  140. throw new Exception($e->getMessage());
  141. }
  142. }
  143. /**
  144. * @notes 上传文件
  145. * @param $cid
  146. * @param int $sourceId
  147. * @param int $source
  148. * @param string $saveDir
  149. * @return array
  150. * @throws Exception
  151. * @author dw
  152. * @date 2023/06/26
  153. */
  154. public static function file($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
  155. {
  156. try {
  157. $config = [
  158. 'default' => ConfigService::get('storage', 'default', 'local'),
  159. 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
  160. ];
  161. // 2、执行文件上传
  162. $StorageDriver = new StorageDriver($config);
  163. $StorageDriver->setUploadFile('file');
  164. $fileName = $StorageDriver->getFileName();
  165. $fileInfo = $StorageDriver->getFileInfo();
  166. // 校验上传文件后缀
  167. if (!in_array(strtolower($fileInfo['ext']), config('project.file_file'))) {
  168. throw new Exception("上传文件不允许上传" . $fileInfo['ext'] . "文件");
  169. }
  170. // 上传文件
  171. $saveDir = self::getUploadUrl($saveDir);
  172. if (!$StorageDriver->upload($saveDir)) {
  173. throw new Exception($StorageDriver->getError());
  174. }
  175. // 3、处理文件名称
  176. if (strlen($fileInfo['name']) > 128) {
  177. $name = substr($fileInfo['name'], 0, 123);
  178. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
  179. $fileInfo['name'] = $name . $nameEnd;
  180. }
  181. // 4、写入数据库中
  182. $file = (AdminTerminalEnum::isTenant() ? new TenantFile() : new File())->create([
  183. 'cid' => $cid,
  184. 'type' => FileEnum::FILE_TYPE,
  185. 'name' => $fileInfo['name'],
  186. 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
  187. 'source' => $source,
  188. 'source_id' => $sourceId,
  189. 'create_time' => time(),
  190. ]);
  191. // 5、返回结果
  192. return [
  193. 'id' => $file['id'],
  194. 'cid' => $file['cid'],
  195. 'type' => $file['type'],
  196. 'name' => $file['name'],
  197. 'uri' => FileService::getFileUrl($file['uri']),
  198. 'url' => $file['uri']
  199. ];
  200. } catch (Exception $e) {
  201. throw new Exception($e->getMessage());
  202. }
  203. }
  204. public static function base64Image($cid, $base64_image, string $saveDir = 'uploads/signs')
  205. {
  206. try {
  207. // 提取Base64数据,去掉"data:image/png;base64,"前缀
  208. $base64_image_content = explode(',', $base64_image)[1];
  209. // 解码Base64数据
  210. $binary_data = base64_decode($base64_image_content);
  211. // 指定保存到本地的文件名和路径
  212. $file_name = 'sign'.time().rand(1000, 9999).".png";
  213. $file_path = $saveDir.'/'.date('Ymd').'/'.$file_name;
  214. $dir_name = dirname($file_path); // 获取目录路径
  215. if (!is_dir($dir_name)) {
  216. if (mkdir($dir_name, 0755, true)) {
  217. } else {
  218. throw new \think\Exception("无法创建目录");
  219. }
  220. }
  221. // 将二进制数据写入文件
  222. if (!file_put_contents($file_path, $binary_data)) {
  223. throw new \think\Exception('签名上传失败');
  224. }
  225. // 4、写入数据库中
  226. $file = (AdminTerminalEnum::isTenant() ? new TenantFile() : new File())->create([
  227. 'cid' => $cid,
  228. 'type' => FileEnum::IMAGE_TYPE,
  229. 'name' => $file_name,
  230. 'uri' => $file_path,
  231. 'source_id' => 0,
  232. 'create_time' => time(),
  233. ]);
  234. // 5、返回结果
  235. return [
  236. 'id' => $file['id'],
  237. 'cid' => $file['cid'],
  238. 'type' => $file['type'],
  239. 'name' => $file['name'],
  240. 'uri' => FileService::getFileUrl($file['uri']),
  241. 'url' => $file['uri']
  242. ];
  243. //
  244. } catch (Exception $e) {
  245. throw new Exception($e->getMessage());
  246. }
  247. }
  248. /**
  249. * @notes 上传地址
  250. * @param $saveDir
  251. * @return string
  252. * @author dw
  253. * @date 2023/06/26
  254. */
  255. private static function getUploadUrl($saveDir):string
  256. {
  257. return $saveDir . '/' . date('Ymd');
  258. }
  259. /**
  260. *
  261. * @param $cid 文件分组ID la_file_cate的分组ID
  262. * @param int $sourceId 上传的用户ID
  263. * @param int $source 用户类型,SOURCE_USER
  264. * @return void
  265. * @author 林海涛
  266. * @date 2024/7/19 下午5:02
  267. */
  268. public static function uploadFies($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
  269. {
  270. try{
  271. $data =[];
  272. $config = [
  273. 'default' => ConfigService::get('storage', 'default', 'local'),
  274. 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
  275. ];
  276. $files = request()->file('files');
  277. $limit = array_merge(config('project.file_image'), config('project.file_video'), config('project.file_file'));
  278. foreach($files as $file){
  279. if (!in_array(strtolower($file->extension()), $limit)) {
  280. throw new Exception('不允许上传' . $file->extension() . '后缀文件');
  281. }
  282. }
  283. $insertData = [];
  284. $model = new File();
  285. $StorageDriver = new StorageDriver($config);
  286. foreach($files as $file)
  287. {
  288. $fileType = '';
  289. $saveDir = '';
  290. if (in_array(strtolower($file->extension()), config('project.file_image'))) {
  291. $fileType = FileEnum::IMAGE_TYPE;
  292. $saveDir = 'uploads/images';
  293. } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
  294. $fileType = FileEnum::VIDEO_TYPE;
  295. $saveDir = 'uploads/video';
  296. } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
  297. $fileType = FileEnum::FILE_TYPE;
  298. $saveDir = 'uploads/file';
  299. }
  300. $StorageDriver->setUploadFile('files',$file->getOriginalName());
  301. $fileName = $StorageDriver->getFileName();
  302. $fileInfo = $StorageDriver->getFileInfo();
  303. $saveDir = self::getUploadUrl($saveDir);
  304. // 上传文件
  305. if (!$StorageDriver->upload($saveDir)) {
  306. throw new Exception($StorageDriver->getError());
  307. }
  308. // 3、处理文件名称
  309. if (strlen($fileInfo['name']) > 128) {
  310. $name = substr($fileInfo['name'], 0, 123);
  311. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
  312. $fileInfo['name'] = $name . $nameEnd;
  313. }
  314. $insertData[] = [
  315. 'cid' => $cid,
  316. 'type' => $fileType,
  317. 'name' => $fileInfo['name'],
  318. 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
  319. 'source' => $source,
  320. 'source_id' => $sourceId,
  321. 'create_time' => time(),
  322. ];
  323. }
  324. if(!empty($insertData)){
  325. $modelData = $model->saveAll($insertData);
  326. $data = [];
  327. foreach($modelData as $v){
  328. $data[] = [
  329. 'id' => $v['id'],
  330. 'cid' => $v['cid'],
  331. 'type' => $v['type'],
  332. 'name' => $v['name'],
  333. 'uri' => FileService::getFileUrl($v['uri']),
  334. 'url' => $v['uri']
  335. ];
  336. }
  337. }
  338. return $data;
  339. }catch (\Exception $e){
  340. throw new Exception($e->getMessage());
  341. }
  342. }
  343. }