Attachment.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?php
  2. namespace App\Models\manager\Common;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Intervention\Image\Facades\Image;
  6. use App\Servers\Aliyun\Oss;
  7. /**
  8. * 附件模型
  9. * @author 唐远望
  10. * @version 1.0
  11. * @date 2025-12-23
  12. */
  13. class Attachment extends Model
  14. {
  15. use HasFactory;
  16. // 与模型关联的表名
  17. protected $table = 'attachment';
  18. // 是否主动维护时间戳
  19. public $timestamps = false;
  20. // 定义时间戳字段名
  21. // const CREATED_AT = 'insert_time';
  22. // const UPDATED_AT = 'update_time';
  23. /**
  24. * 上传图片到阿里云oss
  25. * @author 唐远望
  26. * @version 1.0
  27. * @date 2025-12-23
  28. * @param $request_data 请求数据
  29. * @return array
  30. */
  31. public function uploadMediaAsync($file)
  32. {
  33. $file_info = $this->getFileInfo($file);
  34. $fileName = $file_info ? $file_info['hash_name'] : '';
  35. $filePath = $file_info ? $file_info['path_name'] : '';
  36. $Oss = new Oss();
  37. $res_img_url = $Oss->uploadFile($fileName, $filePath, "zhijiayun-jiansuo", "uploads/process");
  38. if ($res_img_url) {
  39. $this->addUploadimage($file, $res_img_url);
  40. }
  41. return $res_img_url;
  42. }
  43. /**
  44. * 获取签名上传地址
  45. * @author 唐远望
  46. * @version 1.0
  47. * @date 2025-05-29
  48. * @return array
  49. */
  50. public function getSignUrl($file_name)
  51. {
  52. $Oss = new Oss();
  53. $path_dir = "uploads/process/" . date('ymd') . '/' . uniqid() . $file_name;
  54. $res_img_url = $Oss->signUrl("zhijiayun-jiansuo", $path_dir);
  55. return $res_img_url;
  56. }
  57. /**
  58. * 添加图片上传记录
  59. * @author 唐远望
  60. * @version 1.0
  61. * @date 2025-12-23
  62. * @param $file 文件对象
  63. * @param $url 素材url
  64. * @return int
  65. */
  66. public function addUploadimage($file, $url)
  67. {
  68. $image = Image::make($file->getPathname());
  69. $fileInfo = $this->getFileInfo($file);
  70. $attachment_data = [
  71. 'category' => 'image',
  72. 'url' => $url,
  73. 'imagewidth' => $image->width(),
  74. 'imageheight' => $image->height(),
  75. 'imagetype' => $fileInfo['real_extension'],
  76. 'filename' => $fileInfo['original_name'],
  77. 'filesize' => $fileInfo['file_size'],
  78. 'mimetype' => $fileInfo['mime_type'],
  79. 'createtime' => time(),
  80. 'storage' => 'tencent',
  81. 'sha1' => $fileInfo['hash_name'],
  82. ];
  83. $result = $this->insertGetId($attachment_data);
  84. return $result;
  85. }
  86. /**
  87. * 校验文件格式
  88. * @param $file
  89. * @return string
  90. */
  91. public function checkUploadFile($file)
  92. {
  93. $media_type = '';
  94. $allowed_image_extensions = ['jpg', 'jpeg', 'png', 'gif'];
  95. $extension = $file->getClientOriginalExtension();
  96. if (in_array(strtolower($extension), $allowed_image_extensions)) {
  97. $media_type = 'image';
  98. }
  99. $allowed_video_extensions = ['mp4', 'avi', 'wmv', 'mov', 'rmvb', 'flv'];
  100. if (in_array(strtolower($extension), $allowed_video_extensions)) {
  101. $media_type = 'video';
  102. }
  103. $allowed_voice_extensions = ['amr', 'wav', 'wma', 'aac', 'flac', 'mp3'];
  104. if (in_array(strtolower($extension), $allowed_voice_extensions)) {
  105. $media_type = 'voice';
  106. }
  107. $allowed_txt_extensions = ['txt'];
  108. if (in_array(strtolower($extension), $allowed_txt_extensions)) {
  109. $media_type = 'file';
  110. }
  111. return $media_type;
  112. }
  113. /**
  114. * 校验素材信息
  115. * @param $media_type
  116. * @param $media_file
  117. * @return bool|array
  118. */
  119. public function checkuploadmedia($media_file)
  120. {
  121. $media_type = $this->checkUploadFile($media_file);
  122. switch ($media_type) {
  123. case 'image':
  124. if (!$this->checkImgSize($media_file)) {
  125. return ['errcode' => 'error', 'message' => '图片大小超出限制'];
  126. }
  127. break;
  128. case 'voice':
  129. if (!$this->checkVoiceSize($media_file)) {
  130. return ['errcode' => 'error', 'message' => '语音大小超出限制'];
  131. }
  132. break;
  133. case 'video':
  134. if (!$this->checkVideoSize($media_file)) {
  135. return ['errcode' => 'error', 'message' => '视频大小超出限制'];
  136. }
  137. break;
  138. case 'file':
  139. if (!$this->checkTxtSize($media_file)) {
  140. return ['errcode' => 'error', 'message' => '文件大小超出限制'];
  141. }
  142. break;
  143. default:
  144. return ['errcode' => 'error', 'message' => '素材类型错误'];
  145. }
  146. }
  147. /**
  148. * 获取文件信息
  149. * @param $file
  150. * @return bool|array
  151. */
  152. public function getFileInfo($file)
  153. {
  154. if (!$file) {
  155. return false;
  156. }
  157. $fileInfo = [
  158. 'original_name' => $file->getClientOriginalName(), //获取文件原始名称(客户端上传时的文件名)
  159. 'extension' => $file->getClientOriginalExtension(), //获取文件扩展名
  160. 'mime_type' => $file->getClientMimeType(), //获取文件mime类型
  161. 'file_size' => $file->getSize(), //获取文件大小
  162. 'real_extension' => $file->extension(), //获取文件真实扩展名
  163. 'hash_name' => $file->hashName(), //获取文件哈希名(唯一标识)
  164. 'path_name' => $file->getPathname() //获取文件绝对路径
  165. ];
  166. // 使用 $fileInfo 中的信息
  167. return $fileInfo;
  168. }
  169. /**
  170. * 校验图片格式
  171. * @param $file
  172. * @return bool
  173. */
  174. public function checkImgFormat($file)
  175. {
  176. $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
  177. $extension = $file->getClientOriginalExtension();
  178. if (!in_array(strtolower($extension), $allowed_extensions)) {
  179. return false;
  180. }
  181. return true;
  182. }
  183. /**
  184. * 校验图片大小
  185. * @param $file
  186. * @param int $size
  187. */
  188. public function checkImgSize($file, $size = 2)
  189. {
  190. $max_size = $size * 1024 * 1024; // 2M
  191. if ($file->getSize() > $max_size) {
  192. return false;
  193. }
  194. return true;
  195. }
  196. /**
  197. * 校验语音格式
  198. * @param $file
  199. */
  200. public function checkVoiceFormat($file)
  201. {
  202. $allowed_extensions = ['amr', 'wav', 'wma', 'aac', 'flac'];
  203. $extension = $file->getClientOriginalExtension();
  204. if (!in_array(strtolower($extension), $allowed_extensions)) {
  205. return false;
  206. }
  207. return true;
  208. }
  209. /**
  210. * 校验语音大小
  211. * @param $file
  212. * @param int $size
  213. */
  214. public function checkVoiceSize($file, $size = 5)
  215. {
  216. $max_size = $size * 1024 * 1024; // 5M
  217. if ($file->getSize() > $max_size) {
  218. return false;
  219. }
  220. return true;
  221. }
  222. /**
  223. * 校验视频格式
  224. * @param $file
  225. */
  226. public function checkVideoFormat($file)
  227. {
  228. $allowed_extensions = ['mp4', 'avi', 'wmv', 'mov', 'rmvb', 'flv'];
  229. $extension = $file->getClientOriginalExtension();
  230. if (!in_array(strtolower($extension), $allowed_extensions)) {
  231. return false;
  232. }
  233. return true;
  234. }
  235. /**
  236. * 校验视频大小
  237. * @param $file
  238. * @param int $size
  239. */
  240. public function checkVideoSize($file, $size = 10)
  241. {
  242. $max_size = $size * 1024 * 1024; // 10M
  243. if ($file->getSize() > $max_size) {
  244. return false;
  245. }
  246. return true;
  247. }
  248. /**
  249. * 校验txt格式
  250. */
  251. public function checkTxtFormat($file)
  252. {
  253. $allowed_extensions = ['txt'];
  254. $extension = $file->getClientOriginalExtension();
  255. if (!in_array(strtolower($extension), $allowed_extensions)) {
  256. return false;
  257. }
  258. return true;
  259. }
  260. /**
  261. * 校验txt大小
  262. * @param $file
  263. * @param int $size
  264. */
  265. public function checkTxtSize($file, $size = 10)
  266. {
  267. $max_size = $size * 1024 * 1024; // 10M
  268. if ($file->getSize() > $max_size) {
  269. return false;
  270. }
  271. return true;
  272. }
  273. }