UploadService.php 14 KB

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