FileServer.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop开源商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | gitee下载:https://gitee.com/likeshop_gitee
  7. // | github下载:https://github.com/likeshop-github
  8. // | 访问官网:https://www.likeshop.cn
  9. // | 访问社区:https://home.likeshop.cn
  10. // | 访问手册:http://doc.likeshop.cn
  11. // | 微信公众号:likeshop技术社区
  12. // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
  13. // | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
  14. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  15. // | likeshop团队版权所有并拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshop.cn.team
  18. // +----------------------------------------------------------------------
  19. namespace app\common\server;
  20. use app\common\enum\FileEnum;
  21. use app\common\model\File;
  22. use app\common\server\storage\Driver as StorageDriver;
  23. use EasyWeChat\Factory;
  24. use think\Exception;
  25. class FileServer
  26. {
  27. /**
  28. * NOTE: 图片上传
  29. * @author: 张无忌
  30. * @param $cid
  31. * @param string $save_dir
  32. * @return array
  33. * @throws Exception
  34. */
  35. public static function image($cid, $shop_id, $user_id = 0,$save_dir='uploads/images')
  36. {
  37. try {
  38. // 1、获取当前存储对象
  39. $config = [
  40. 'default' => ConfigServer::get('storage', 'default', 'local'),
  41. 'engine' => ConfigServer::get('storage_engine') ?? ['local'=>[]]
  42. ];
  43. // 2、执行文件上传
  44. $StorageDriver = new StorageDriver($config);
  45. $StorageDriver->setUploadFile('file');
  46. $fileName = $StorageDriver->getFileName();
  47. $fileInfo = $StorageDriver->getFileInfo();
  48. // 验证是否是图片文件
  49. if (! check_is_image($fileInfo['realPath'] ?? '')) {
  50. throw new Exception('不是有效的图像文件');
  51. }
  52. // 校验上传文件后缀
  53. if (!in_array(strtolower($fileInfo['ext']), config('project.file_image'))) {
  54. throw new Exception("上传图片不允许上传". $fileInfo['ext'] . "文件");
  55. }
  56. // 上传文件
  57. $save_dir = $save_dir . '/' . date('Ymd');
  58. if (!$StorageDriver->upload($save_dir)) {
  59. throw new Exception($StorageDriver->getError());
  60. }
  61. // 3、处理文件名称
  62. if (strlen($fileInfo['name']) > 128) {
  63. $file_name = substr($fileInfo['name'], 0, 123);
  64. $file_end = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
  65. $fileInfo['name'] = $file_name.$file_end;
  66. }
  67. // 4、写入数据库中
  68. $file = File::create([
  69. 'cid' => $cid,
  70. 'type' => FileEnum::IMAGE_TYPE,
  71. 'name' => $fileInfo['name'],
  72. 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName),
  73. 'shop_id' => $shop_id,
  74. 'user_id' => $user_id,
  75. 'create_time' => time(),
  76. 'ip' => request()->ip(),
  77. ]);
  78. // 5、返回结果
  79. return [
  80. 'id' => $file['id'],
  81. 'cid' => $file['cid'],
  82. 'type' => $file['type'],
  83. 'name' => $file['name'],
  84. 'shop_id' => $file['shop_id'],
  85. 'uri' => UrlServer::getFileUrl($file['uri']),
  86. 'base_uri' => clearDomain($file['uri'])
  87. ];
  88. } catch (\Exception $e) {
  89. throw new Exception($e->getMessage());
  90. }
  91. }
  92. /**
  93. * 视频上传
  94. */
  95. public static function video($cid, $shop_id, $save_dir='uploads/video')
  96. {
  97. try {
  98. // 1、获取当前存储对象
  99. $config = [
  100. 'default' => ConfigServer::get('storage', 'default', 'local'),
  101. 'engine' => ConfigServer::get('storage_engine') ?? ['local'=>[]]
  102. ];
  103. // 2、执行文件上传
  104. $StorageDriver = new StorageDriver($config);
  105. $StorageDriver->setUploadFile('file');
  106. $fileName = $StorageDriver->getFileName();
  107. $fileInfo = $StorageDriver->getFileInfo();
  108. // 验证是否是视频
  109. if (! check_is_video($StorageDriver->getFileInfo()['realPath'] ?? '')) {
  110. throw new Exception('不是有效的视频文件');
  111. }
  112. // 校验上传文件后缀
  113. if (!in_array(strtolower($fileInfo['ext']), config('project.file_video'))) {
  114. throw new Exception("上传视频不允许上传". $fileInfo['ext'] . "文件");
  115. }
  116. // 上传文件
  117. $save_dir = $save_dir . '/' . date('Ymd');
  118. if (!$StorageDriver->upload($save_dir)) {
  119. throw new Exception($StorageDriver->getError());
  120. }
  121. // 3、处理文件名称
  122. if (strlen($fileInfo['name']) > 128) {
  123. $file_name = substr($fileInfo['name'], 0, 123);
  124. $file_end = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
  125. $fileInfo['name'] = $file_name.$file_end;
  126. }
  127. // 4、写入数据库中
  128. $file = File::create([
  129. 'cid' => $cid,
  130. 'type' => FileEnum::VIDEO_TYPE,
  131. 'name' => $fileInfo['name'],
  132. 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName),
  133. 'shop_id' => $shop_id,
  134. 'create_time' => time(),
  135. 'ip' => request()->ip(),
  136. ]);
  137. // 5、返回结果
  138. return [
  139. 'id' => $file['id'],
  140. 'cid' => $file['cid'],
  141. 'type' => $file['type'],
  142. 'name' => $file['name'],
  143. 'shop_id' => $file['shop_id'],
  144. 'uri' => UrlServer::getFileUrl($file['uri'])
  145. ];
  146. } catch (\Exception $e) {
  147. throw new Exception($e->getMessage());
  148. }
  149. }
  150. /**
  151. * Notes: 用户上传图片
  152. * @param string $save_dir (保存目录, 不建议修改, 不要超二级目录)
  153. * @param bool $isLocal (是否存不使用oss 只存本地, 上传退款证书会用到)
  154. * @return array
  155. * @author 张无忌(2021/2/20 9:53)
  156. */
  157. public static function other($save_dir='uploads/other', $isLocal=false )
  158. {
  159. try {
  160. if ($isLocal == false) {
  161. $config = [
  162. 'default' => ConfigServer::get('storage', 'default', 'local'),
  163. 'engine' => ConfigServer::get('storage_engine')
  164. ];
  165. } else {
  166. $config = [
  167. 'default' => 'local',
  168. 'engine' => ConfigServer::get('storage_engine')
  169. ];
  170. }
  171. if (empty($config['engine']['local'])) {
  172. $config['engine']['local'] = [];
  173. }
  174. $StorageDriver = new StorageDriver($config);
  175. $StorageDriver->setUploadFile('file');
  176. if (!$StorageDriver->upload($save_dir)) {
  177. throw new Exception('上传失败' . $StorageDriver->getError());
  178. }
  179. // 图片上传路径
  180. $fileName = $StorageDriver->getFileName();
  181. // 图片信息
  182. $fileInfo = $StorageDriver->getFileInfo();
  183. // 信息
  184. $data = [
  185. 'name' => $fileInfo['name'],
  186. 'type' => FileEnum::OTHER_TYPE,
  187. 'uri' => $save_dir . '/' . str_replace("\\","/", $fileName),
  188. 'create_time' => time(),
  189. 'shop_id' => 0
  190. ];
  191. File::insert($data);
  192. return ['上传文件成功', $data];
  193. } catch (\Exception $e) {
  194. $message = lang($e->getMessage()) ?? $e->getMessage();
  195. return ['上传文件失败:',$message];
  196. }
  197. }
  198. /**
  199. * @notes 微信直播素材
  200. * @param $filePath
  201. * @return mixed
  202. * @throws Exception
  203. * @throws \GuzzleHttp\Exception\GuzzleException
  204. * @author 段誉
  205. * @date 2023/2/15 17:28\
  206. */
  207. public static function wechatLiveMaterial($filePath)
  208. {
  209. try {
  210. $fileName = basename($filePath);
  211. $config = WeChatServer::getMnpConfig();
  212. $app = Factory::miniProgram($config);
  213. $localFileDir = public_path() . pathinfo(parse_url($filePath, PHP_URL_PATH), PATHINFO_DIRNAME) . '/';
  214. $localFile = $localFileDir . $fileName;
  215. // 切换oss后可能不存在,在本地查找后下载
  216. $config = [
  217. 'default' => ConfigServer::get('storage', 'default', 'local'),
  218. 'engine' => ConfigServer::get('storage_engine')
  219. ];
  220. if ($config['default'] != 'local' && !file_exists($localFile)) {
  221. $res = download_file(UrlServer::getFileUrl($filePath), $localFileDir, $fileName);
  222. if (empty($res)) {
  223. throw new Exception("资源下载失败");
  224. }
  225. }
  226. // 上传微信
  227. $result = $app->media->uploadImage($localFile);
  228. if (isset($result['errcode']) && 0 != $result['errcode']) {
  229. $err = $result['errmsg'] ?? '微信上传图片失败';
  230. throw new \Exception($err);
  231. }
  232. return $result['media_id'];
  233. } catch (\Exception $e) {
  234. throw new Exception($e->getMessage());
  235. }
  236. }
  237. }