1
0

UploadService.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  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. if(AdminTerminalEnum::isTenant()){
  62. $file = (new TenantFile())->create([
  63. 'tenant_id' => request()->tenantId,
  64. 'cid' => $cid,
  65. 'type' => FileEnum::IMAGE_TYPE,
  66. 'name' => $fileInfo['name'],
  67. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  68. 'source' => $source,
  69. 'source_id' => $sourceId,
  70. 'create_time' => time(),
  71. ]);
  72. }else{
  73. $file = (new File())->create([
  74. 'cid' => $cid,
  75. 'type' => FileEnum::IMAGE_TYPE,
  76. 'name' => $fileInfo['name'],
  77. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  78. 'source' => $source,
  79. 'source_id' => $sourceId,
  80. 'create_time' => time(),
  81. ]);
  82. }
  83. // 5、返回结果
  84. return [
  85. 'id' => $file['id'],
  86. 'cid' => $file['cid'],
  87. 'type' => $file['type'],
  88. 'name' => $file['name'],
  89. 'uri' => FileService::getFileUrl($file['uri']),
  90. 'url' => $file['uri']
  91. ];
  92. } catch (Exception $e) {
  93. throw new Exception($e->getMessage());
  94. }
  95. }
  96. /**
  97. * @notes 视频上传
  98. * @param $cid
  99. * @param int $user_id
  100. * @param string $saveDir
  101. * @return array
  102. * @throws Exception
  103. * @author 段誉
  104. * @date 2021/12/29 16:32
  105. */
  106. public static function video($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/video')
  107. {
  108. try {
  109. $config = [
  110. 'default' => ConfigService::get('storage', 'default', 'local'),
  111. 'engine' => ConfigService::get('storage') ?? ['local'=>[]],
  112. ];
  113. // 2、执行文件上传
  114. $StorageDriver = new StorageDriver($config);
  115. $StorageDriver->setUploadFile('file');
  116. $fileName = $StorageDriver->getFileName();
  117. $fileInfo = $StorageDriver->getFileInfo();
  118. // 校验上传文件后缀
  119. if (!in_array(strtolower($fileInfo['ext']), config('project.file_video'))) {
  120. throw new Exception("上传视频不允许上传". $fileInfo['ext'] . "文件");
  121. }
  122. // 上传文件
  123. $saveDir = self::getUploadUrl($saveDir);
  124. if (!$StorageDriver->upload($saveDir)) {
  125. throw new Exception($StorageDriver->getError());
  126. }
  127. // 3、处理文件名称
  128. if (strlen($fileInfo['name']) > 128) {
  129. $name = substr($fileInfo['name'], 0, 123);
  130. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
  131. $fileInfo['name'] = $name . $nameEnd;
  132. }
  133. // 4、写入数据库中
  134. if(AdminTerminalEnum::isTenant()){
  135. $file = (new TenantFile())->create([
  136. 'tenant_id' => request()->tenantId,
  137. 'cid' => $cid,
  138. 'type' => FileEnum::VIDEO_TYPE,
  139. 'name' => $fileInfo['name'],
  140. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  141. 'source' => $source,
  142. 'source_id' => $sourceId,
  143. 'create_time' => time(),
  144. ]);
  145. }else{
  146. $file = (new File())->create([
  147. 'cid' => $cid,
  148. 'type' => FileEnum::VIDEO_TYPE,
  149. 'name' => $fileInfo['name'],
  150. 'uri' => $saveDir . '/' . str_replace("\\","/", $fileName),
  151. 'source' => $source,
  152. 'source_id' => $sourceId,
  153. 'create_time' => time(),
  154. ]);
  155. }
  156. // 5、返回结果
  157. return [
  158. 'id' => $file['id'],
  159. 'cid' => $file['cid'],
  160. 'type' => $file['type'],
  161. 'name' => $file['name'],
  162. 'uri' => FileService::getFileUrl($file['uri']),
  163. 'url' => $file['uri']
  164. ];
  165. } catch (Exception $e) {
  166. throw new Exception($e->getMessage());
  167. }
  168. }
  169. /**
  170. * @notes 上传文件
  171. * @param $cid
  172. * @param int $sourceId
  173. * @param int $source
  174. * @param string $saveDir
  175. * @return array
  176. * @throws Exception
  177. * @author dw
  178. * @date 2023/06/26
  179. */
  180. public static function file($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
  181. {
  182. try {
  183. $config = [
  184. 'default' => ConfigService::get('storage', 'default', 'local'),
  185. 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
  186. ];
  187. // 2、执行文件上传
  188. $StorageDriver = new StorageDriver($config);
  189. $StorageDriver->setUploadFile('file');
  190. $fileName = $StorageDriver->getFileName();
  191. $fileInfo = $StorageDriver->getFileInfo();
  192. // 校验上传文件后缀
  193. if (!in_array(strtolower($fileInfo['ext']), config('project.file_file'))) {
  194. throw new Exception("上传文件不允许上传" . $fileInfo['ext'] . "文件");
  195. }
  196. // 上传文件
  197. $saveDir = self::getUploadUrl($saveDir);
  198. if (!$StorageDriver->upload($saveDir)) {
  199. throw new Exception($StorageDriver->getError());
  200. }
  201. // 3、处理文件名称
  202. if (strlen($fileInfo['name']) > 128) {
  203. $name = substr($fileInfo['name'], 0, 123);
  204. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
  205. $fileInfo['name'] = $name . $nameEnd;
  206. }
  207. // 4、写入数据库中
  208. if(AdminTerminalEnum::isTenant()) {
  209. $file = (new TenantFile())->create([
  210. 'tenant_id' => request()->tenantId,
  211. 'cid' => $cid,
  212. 'type' => FileEnum::FILE_TYPE,
  213. 'name' => $fileInfo['name'],
  214. 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
  215. 'source' => $source,
  216. 'source_id' => $sourceId,
  217. 'create_time' => time(),
  218. ]);
  219. }else{
  220. $file = (new File())->create([
  221. 'cid' => $cid,
  222. 'type' => FileEnum::FILE_TYPE,
  223. 'name' => $fileInfo['name'],
  224. 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
  225. 'source' => $source,
  226. 'source_id' => $sourceId,
  227. 'create_time' => time(),
  228. ]);
  229. }
  230. // 5、返回结果
  231. return [
  232. 'id' => $file['id'],
  233. 'cid' => $file['cid'],
  234. 'type' => $file['type'],
  235. 'name' => $file['name'],
  236. 'uri' => FileService::getFileUrl($file['uri']),
  237. 'url' => $file['uri']
  238. ];
  239. } catch (Exception $e) {
  240. throw new Exception($e->getMessage());
  241. }
  242. }
  243. public static function base64Image($cid, $base64_image, string $saveDir = 'uploads/signs')
  244. {
  245. try {
  246. // 提取Base64数据,去掉"data:image/png;base64,"前缀
  247. $base64_image_content = explode(',', $base64_image)[1];
  248. // 解码Base64数据
  249. $binary_data = base64_decode($base64_image_content);
  250. // 指定保存到本地的文件名和路径
  251. $file_name = 'sign'.time().rand(1000, 9999).".png";
  252. $file_path = $saveDir.'/'.date('Ymd').'/'.$file_name;
  253. $dir_name = dirname($file_path); // 获取目录路径
  254. if (!is_dir($dir_name)) {
  255. if (mkdir($dir_name, 0755, true)) {
  256. } else {
  257. throw new \think\Exception("无法创建目录");
  258. }
  259. }
  260. // 将二进制数据写入文件
  261. if (!file_put_contents($file_path, $binary_data)) {
  262. throw new \think\Exception('签名上传失败');
  263. }
  264. // 4、写入数据库中
  265. if(AdminTerminalEnum::isTenant()) {
  266. $file = (new TenantFile())->create([
  267. 'tenant_id' => request()->tenantId,
  268. 'cid' => $cid,
  269. 'type' => FileEnum::IMAGE_TYPE,
  270. 'name' => $file_name,
  271. 'uri' => $file_path,
  272. 'source_id' => 0,
  273. 'create_time' => time(),
  274. ]);
  275. }else{
  276. $file = (new File())->create([
  277. 'cid' => $cid,
  278. 'type' => FileEnum::IMAGE_TYPE,
  279. 'name' => $file_name,
  280. 'uri' => $file_path,
  281. 'source_id' => 0,
  282. 'create_time' => time(),
  283. ]);
  284. }
  285. // 5、返回结果
  286. return [
  287. 'id' => $file['id'],
  288. 'cid' => $file['cid'],
  289. 'type' => $file['type'],
  290. 'name' => $file['name'],
  291. 'uri' => FileService::getFileUrl($file['uri']),
  292. 'url' => $file['uri']
  293. ];
  294. //
  295. } catch (Exception $e) {
  296. throw new Exception($e->getMessage());
  297. }
  298. }
  299. /**
  300. * @notes 上传地址
  301. * @param $saveDir
  302. * @return string
  303. * @author dw
  304. * @date 2023/06/26
  305. */
  306. private static function getUploadUrl($saveDir):string
  307. {
  308. return $saveDir . '/' . date('Ymd');
  309. }
  310. /**
  311. *
  312. * @param $cid 文件分组ID la_file_cate的分组ID
  313. * @param int $sourceId 上传的用户ID
  314. * @param int $source 用户类型,SOURCE_USER
  315. * @return void
  316. * @author 林海涛
  317. * @date 2024/7/19 下午5:02
  318. */
  319. public static function uploadFies($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/file')
  320. {
  321. try{
  322. $data =[];
  323. $config = [
  324. 'default' => ConfigService::get('storage', 'default', 'local'),
  325. 'engine' => ConfigService::get('storage') ?? [ 'local' => [] ],
  326. ];
  327. $files = request()->file('files');
  328. $limit = array_merge(config('project.file_image'), config('project.file_video'), config('project.file_file'));
  329. foreach($files as $file){
  330. if (!in_array(strtolower($file->extension()), $limit)) {
  331. throw new Exception('不允许上传' . $file->extension() . '后缀文件');
  332. }
  333. }
  334. $insertData = [];
  335. $model = new File();
  336. $StorageDriver = new StorageDriver($config);
  337. foreach($files as $file)
  338. {
  339. $fileType = '';
  340. $saveDir = '';
  341. if (in_array(strtolower($file->extension()), config('project.file_image'))) {
  342. $fileType = FileEnum::IMAGE_TYPE;
  343. $saveDir = 'uploads/images';
  344. } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
  345. $fileType = FileEnum::VIDEO_TYPE;
  346. $saveDir = 'uploads/video';
  347. } else if(in_array(strtolower($file->extension()), config('project.file_video'))){
  348. $fileType = FileEnum::FILE_TYPE;
  349. $saveDir = 'uploads/file';
  350. }
  351. $StorageDriver->setUploadFile('files',$file->getOriginalName());
  352. $fileName = $StorageDriver->getFileName();
  353. $fileInfo = $StorageDriver->getFileInfo();
  354. $saveDir = self::getUploadUrl($saveDir);
  355. // 上传文件
  356. if (!$StorageDriver->upload($saveDir)) {
  357. throw new Exception($StorageDriver->getError());
  358. }
  359. // 3、处理文件名称
  360. if (strlen($fileInfo['name']) > 128) {
  361. $name = substr($fileInfo['name'], 0, 123);
  362. $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name']) - 5, strlen($fileInfo['name']));
  363. $fileInfo['name'] = $name . $nameEnd;
  364. }
  365. $insertData[] = [
  366. 'cid' => $cid,
  367. 'type' => $fileType,
  368. 'name' => $fileInfo['name'],
  369. 'uri' => $saveDir . '/' . str_replace("\\", "/", $fileName),
  370. 'source' => $source,
  371. 'source_id' => $sourceId,
  372. 'create_time' => time(),
  373. ];
  374. }
  375. if(!empty($insertData)){
  376. $modelData = $model->saveAll($insertData);
  377. $data = [];
  378. foreach($modelData as $v){
  379. $data[] = [
  380. 'id' => $v['id'],
  381. 'cid' => $v['cid'],
  382. 'type' => $v['type'],
  383. 'name' => $v['name'],
  384. 'uri' => FileService::getFileUrl($v['uri']),
  385. 'url' => $v['uri']
  386. ];
  387. }
  388. }
  389. return $data;
  390. }catch (\Exception $e){
  391. throw new Exception($e->getMessage());
  392. }
  393. }
  394. }