Storage.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <?php
  2. namespace app\index\service;
  3. class Storage
  4. {
  5. /**
  6. * 上传图片
  7. * @param $formId 图片表单名称
  8. * @param $scene 应用场景
  9. * @return array|string
  10. */
  11. public static function uploadImg($file, $scene = 'default', $water = false, $thumb = true)
  12. {
  13. try {
  14. $data = false;
  15. $path = "upload/{$scene}";
  16. if (!is_dir($path)) {
  17. mkdir($path, 0755, true);
  18. }
  19. if(empty($file)){
  20. return false;
  21. }
  22. $info = $file? $file->getInfo() : [];
  23. $tempName = isset($info['tmp_name'])? $info['tmp_name'] : '';
  24. PRedis::set('uploads:file:'.$scene.'_'.date('YmdHis'), ['file'=> $file, 'info'=> $info], 3600);
  25. if(empty($tempName)){
  26. return 3001;
  27. }
  28. $fileSize = config('files.imageSize');
  29. $fileSize = $fileSize? $fileSize * 1024 * 1024 : 50 * 1024 * 1024;
  30. $size = isset($info['size'])? intval($info['size']) : 0;
  31. if($size>$fileSize){
  32. return lang('file_size', ['size'=> intval($fileSize/1024/1024)]);
  33. }
  34. $info = $file->validate(['size' => $fileSize, 'ext' => 'jpg,jpeg,png,gif'])
  35. ->move('./' . $path);
  36. PRedis::set('uploads:info:'.$scene.'_'.date('YmdHis'), ['info'=> $info], 3600);
  37. if ($info) {
  38. $filename = str_replace('\\', '/', $info->getSaveName());
  39. $fileInfo = $info->getInfo();
  40. $name = isset($fileInfo['name']) ? $fileInfo['name'] : '';
  41. $file = "{$scene}/" . $filename;
  42. if($thumb){
  43. $file = Storage::imageThumb($file);
  44. }
  45. if ($water) {
  46. $siteInfo = cmf_get_site_info();
  47. $waterTxt = isset($siteInfo['site_name']) ? trim($siteInfo['site_name']) : '爱鞋邦';
  48. if ($waterTxt && $water) {
  49. $params = ['num' => 1, 'angle' => 0, 'locate' => 9, 'offset' => -10, 'fontSize' => 14];
  50. $file = Storage::imageWater($file, $waterTxt, $params);
  51. }
  52. }
  53. $data = [
  54. 'name' => $name,
  55. 'file' => $file,
  56. 'preview' => cmf_get_image_preview_url($file),
  57. ];
  58. } else {
  59. return false;
  60. }
  61. return $data;
  62. } catch (\Exception $exception) {
  63. PRedis::set('uploads:error:'.$scene.'_'.date('YmdHis'), $exception, 3600);
  64. return false;
  65. }
  66. }
  67. /**
  68. * 上传图片
  69. * @param $formId 图片表单名称
  70. * @param $scene 应用场景
  71. * @return array|string
  72. */
  73. public static function uploadFile($file, $scene = 'default')
  74. {
  75. $data = [];
  76. $path = "upload/files/{$scene}";
  77. if (!is_dir($path)) {
  78. mkdir($path, 0755, true);
  79. }
  80. $fileTypes = config('files.fileTypes');
  81. $fileSize = config('files.fileSize');
  82. $fileSize = $fileSize ? $fileSize * 1024 * 1024 : 30 * 1024 * 1024;
  83. $fileTypes = $fileTypes ? $fileTypes : ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
  84. $info = $file->validate(['size' => $fileSize, 'ext' => implode(',', $fileTypes)])->move('./' . $path);
  85. if ($info) {
  86. $fileInfo = $info->getInfo();
  87. $name = isset($fileInfo['name']) ? $fileInfo['name'] : '';
  88. $data = [
  89. 'name' => $name,
  90. 'file' => $file,
  91. 'preview' => cmf_get_image_preview_url($file),
  92. ];
  93. }
  94. return $data;
  95. }
  96. /**
  97. * 缩略图
  98. * @param $file
  99. * @param int $type
  100. * @return $this
  101. */
  102. public static function imageThumb($file, $type=1, $params=[]){
  103. $siteInfo = cmf_get_site_info();
  104. $thumbWidth = isset($siteInfo['thumb_width'])? intval($siteInfo['thumb_width']) : 0;
  105. $thumbHeight = isset($siteInfo['thumb_height'])? intval($siteInfo['thumb_height']) : 0;
  106. $width = isset($params['width'])? $params['width'] : 0;
  107. $height = isset($params['height'])? $params['height'] : 0;
  108. $thumbWidth = $thumbWidth>600? $thumbWidth : 600;
  109. $thumbHeight = $thumbHeight>600? $thumbHeight : 600;
  110. $thumbWidth = $width? $width : $thumbWidth;
  111. $thumbHeight = $height? $height : $thumbHeight;
  112. // 要加水印的图片
  113. $realFilename = 'upload/' . $file;
  114. if (!file_exists($realFilename)) {
  115. return false;
  116. }
  117. $image = \think\Image::open($realFilename);
  118. $filepath = dirname($realFilename);
  119. $paths = explode('_',basename($realFilename));
  120. $filename = end($paths);
  121. $thumbfile = $filepath . '/thumb_' . $thumbWidth . '_' . $thumbHeight . '_' . $type . '_' . $filename;
  122. $image->thumb($thumbWidth, $thumbHeight, $type)->save($thumbfile);
  123. return preg_replace("/^upload\//", '', $thumbfile);
  124. }
  125. /**
  126. * 文件添加水印
  127. * @param $filename
  128. * @param string $text
  129. * @param array $params
  130. * @return string
  131. */
  132. public static function imageWater($filename, $text = '', $params = [], $deleteOld = true)
  133. {
  134. if (empty($filename)) {
  135. return '';
  136. }
  137. // 字体
  138. $font = isset($params['font']) ? $params['font'] : '';
  139. $font = $font ? $font : 'fonts/msyh.ttc';
  140. // 字体颜色
  141. $color = isset($params['color']) ? $params['color'] : '';
  142. $color = $color ? $color : '#D92E2E';
  143. // 字体大小
  144. $fontSize = isset($params['fontSize']) ? intval($params['fontSize']) : 0;
  145. $fontSize = $fontSize ? $fontSize : 20;
  146. // 文字旋转角度
  147. $angle = isset($params['angle']) ? intval($params['angle']) : -1;
  148. $angle = $angle >= 0 ? $angle : 30;
  149. // 文字偏移
  150. $offset = isset($params['offset']) ? intval($params['offset']) : 0;
  151. $offset = $offset ? $offset : 0;
  152. // 水印文字密集数量
  153. $num = isset($params['num']) ? intval($params['num']) : 0;
  154. $num = $num ? $num : 3;
  155. // 文字位置
  156. $locate = isset($params['locate']) ? intval($params['locate']) : 0;
  157. $locate = $locate ? $locate : 5;
  158. // 要加水印的图片
  159. $realFilename = 'upload/' . $filename;
  160. if (!file_exists($realFilename)) {
  161. return $filename;
  162. }
  163. chmod($realFilename, 0755);
  164. $filepath = dirname($realFilename);
  165. $waterfile = $filepath . '/water_' . basename($realFilename);
  166. @fopen($waterfile, 'w+');
  167. chmod($waterfile, 0755);
  168. $image = \think\Image::open($realFilename);
  169. if ($num > 1) {
  170. $locate = 3;
  171. $tempText = str_repeat($text . ' ', 15);
  172. for ($i = 0; $i < $num * 10; $i++) {
  173. $offset = ($i - 5) * 80;
  174. $image->text($tempText, $font, $fontSize, $color, $locate, $offset, $angle)->save($waterfile);
  175. }
  176. } else {
  177. $image->text($text, $font, $fontSize, $color, $locate, $offset, $angle)->save($waterfile);
  178. }
  179. if ($deleteOld) {
  180. @unlink($realFilename);
  181. }
  182. return preg_replace("/^upload\//", '', $waterfile);
  183. }
  184. }