Attachment.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. namespace App\Services\Base;
  3. use App\Models\AttachmentInfoModel;
  4. use App\Services\OSS;
  5. use Response;
  6. use App\Models\BaseSettingsModel;
  7. use Image;
  8. class Attachment
  9. {
  10. private $_model;
  11. public function __construct() {
  12. if( !$this->_model ) $this->_model = new AttachmentInfoModel();
  13. }
  14. /***
  15. * 上传到阿里云
  16. * @param $field
  17. * @param $request
  18. * @param string $tag
  19. * @param float|int $size
  20. * @param array $mimeType
  21. * @return mixed
  22. */
  23. public function aliUpload($field, $request, $size = 10 * 1024 * 1024, array $mimeType = ['image/jpeg', 'image/png', 'image/gif','video/mp4','video/quicktime']){
  24. $class = isset($request['class']) ? $request['class'] : 1;
  25. $file = $request[$field];
  26. if ($file === null) {
  27. return $this->_jsonMessage(500, ['message' => '没有文件被上传']);
  28. }
  29. if (!$file->isValid()) {
  30. return $this->_jsonMessage(500, ['message' => '不允许上传']);
  31. }
  32. $fileSize = $file->getSize();
  33. if ($fileSize > $size) {
  34. return $this->_jsonMessage(500, ['message' => '文件大小超过限制']);
  35. }
  36. $fileMimeType = $file->getMimeType();
  37. if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
  38. return $this->_jsonMessage(500, ['message' => '文件格式不被允许']);
  39. }
  40. $clientName = $file->getClientOriginalName();
  41. $md5 = md5($clientName . time());
  42. $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
  43. $file_Path = $file->getRealPath();
  44. try {
  45. $ok = OSS::publicUpload(config('alioss.BucketName'),$md5_filename, $file_Path);
  46. if(!$ok){
  47. return $this->_jsonMessage(500, ['message' => '上传失败']);
  48. }
  49. $attachment = new AttachmentInfoModel();
  50. $attachment->name = $clientName;
  51. $attachment->md5 = $md5;
  52. $attachment->path = config('alioss.FileUrl').$md5_filename;
  53. $attachment->url = config('alioss.FileUrl').$md5_filename;
  54. $attachment->size = $fileSize;
  55. $attachment->file_type = $fileMimeType;
  56. $attachment->class = $class;
  57. if ($attachment->save()) {
  58. return $this->_jsonMessage(200, ['message' => "上传成功", 'fileurl' => config('alioss.FileUrl').$md5_filename,'name'=>$md5_filename]);
  59. } else {
  60. OSS::publicDeleteObject(config('alioss.BucketName'),$md5_filename);
  61. return $this->_jsonMessage(500, ['message' => '数据库保存错误']);
  62. }
  63. } catch (FileException $e) {
  64. return $this->_jsonMessage(500, ['message' => '保存失败']);
  65. }
  66. }
  67. public function _jsonMessage($status,$ret){
  68. $ret['code'] = $status;
  69. return $ret;
  70. }
  71. /**
  72. * 上传到本地
  73. *
  74. * @param string|array $field 文件key
  75. * @param Request $request laravel's http request
  76. * @param string $tag 文件tag
  77. * @param int $size 文件size限制,默认2M
  78. * @param array $mimeType 文件mime类型限制,默认不限
  79. * @return array|string|int 返回:md5字串|ErrorCode或[md5字串|ErrorCode]
  80. */
  81. public function localUpload($field, $request, $size = 10 * 1024 * 1024, array $mimeType = ['image/jpeg', 'image/png', 'image/gif','video/mp4','video/quicktime'])
  82. {
  83. $tag = $request['folder'];
  84. $class = isset($request['class']) ? $request['class'] : 1;
  85. $width = isset($request['width']) ? $request['width'] : 0;
  86. $height = isset($request['height']) ? $request['height'] : 0;
  87. $rel_path = '/upload/images/'.$tag . '/' . date('Ymd');
  88. $path = public_path() . $rel_path;
  89. if (!file_exists($path)) {
  90. if (!@mkdir($path, 0755, true)) {
  91. return $this->_jsonMessage(500, ['message' => '目录创建失败']);
  92. }
  93. }
  94. $file = is_array($request[$field])?$request[$field][0]:$request[$field];
  95. if ($file === null) {
  96. return $this->_jsonMessage(500, ['message' => '没有文件被上传']);
  97. }
  98. if (!$file->isValid()) {
  99. return $this->_jsonMessage(500, ['message' => '不允许上传']);
  100. }
  101. $fileSize = $file->getSize();
  102. if ($fileSize > $size) {
  103. return $this->_jsonMessage(500, ['message' => '文件大小超过限制']);
  104. }
  105. $fileMimeType = $file->getMimeType();
  106. if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
  107. return $this->_jsonMessage(500, ['message' => '文件格式不被允许']);
  108. }
  109. $clientName = $file->getClientOriginalName();
  110. $md5 = md5($clientName . time());
  111. $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
  112. try {
  113. if(!$file->move($path, $md5_filename)){
  114. return $this->_jsonMessage(500, ['message' => '上传失败']);
  115. }
  116. $real_path = $path . '/' . $md5_filename;
  117. $url_path = $rel_path . '/' . $md5_filename;
  118. $source_info = null;
  119. if(($source_info = getimagesize($real_path)) != null) {
  120. $source_width = $source_info[0];
  121. $source_height = $source_info[1];
  122. \Log::info('$source_width'.$source_width.'$source_height'.$source_height);
  123. if($width || $height){
  124. if($width==0){
  125. $width = $source_width*($height/$source_height);
  126. }
  127. if($height==0){
  128. $height = $source_height*($width/$source_width);
  129. }
  130. \Log::info('$width'.$width.'$height'.$height);
  131. Image::make($real_path)->resize($width, $height)->save($real_path);
  132. }
  133. }
  134. $attachment = new AttachmentInfoModel();
  135. $attachment->name = $clientName;
  136. $attachment->md5 = $md5;
  137. $attachment->path = $real_path;
  138. $attachment->url = $url_path;
  139. $attachment->size = $fileSize;
  140. $attachment->file_type = $fileMimeType;
  141. $attachment->class = $class;
  142. if ($attachment->save()) {
  143. return $this->_jsonMessage(200, ['message' => "上传成功", 'fileurl' => $url_path,'name'=>$md5_filename]);
  144. } else {
  145. @unlink($real_path);
  146. return $this->_jsonMessage(500, ['message' => '数据库保存错误']);
  147. }
  148. } catch (FileException $e) {
  149. return $this->_jsonMessage(500, ['message' => '上传失败']);
  150. }
  151. }
  152. public function fileUpload($field, $request, $tag = 'files', $size = 10 * 1024 * 1024, array $mimeType = ['image/jpeg', 'image/png', 'image/gif','video/mp4','video/quicktime','text/plain']){
  153. $tag = $request['folder'];
  154. $class = isset($request['class']) ? $request['class'] : 1;
  155. $width = isset($request['width']) ? $request['width'] : 0;
  156. $height = isset($request['height']) ? $request['height'] : 0;
  157. $rel_path = $tag . '/' . date('Ymd');
  158. $path = public_path() . $rel_path;
  159. if (!file_exists($path)) {
  160. if (!@mkdir($path, 0755, true)) {
  161. return $this->_jsonMessage(500, ['message' => '目录创建失败']);
  162. }
  163. }
  164. $file = $request[$field];
  165. if ($file === null) {
  166. return $this->_jsonMessage(500, ['message' => '没有文件被上传']);
  167. }
  168. if (!$file->isValid()) {
  169. return $this->_jsonMessage(500, ['message' => '不允许上传']);
  170. }
  171. $fileSize = $file->getSize();
  172. if ($fileSize > $size) {
  173. return $this->_jsonMessage(500, ['message' => '文件大小超过限制']);
  174. }
  175. $fileMimeType = $file->getMimeType();
  176. if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
  177. return $this->_jsonMessage(500, ['message' => '文件格式不被允许']);
  178. }
  179. $clientName = $file->getClientOriginalName();
  180. $md5 = md5($clientName . time());
  181. $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
  182. try {
  183. if(!$file->move($path, $md5_filename)){
  184. return $this->_jsonMessage(500, ['message' => '上传失败']);
  185. }
  186. $real_path = $path . '/' . $md5_filename;
  187. $url_path = $rel_path . '/' . $md5_filename;
  188. $source_info = null;
  189. if(($source_info = getimagesize($real_path)) != null) {
  190. $source_width = $source_info[0];
  191. $source_height = $source_info[1];
  192. \Log::info('$source_width'.$source_width.'$source_height'.$source_height);
  193. if($width || $height){
  194. if($width==0){
  195. $width = $source_width*($height/$source_height);
  196. }
  197. if($height==0){
  198. $height = $source_height*($width/$source_width);
  199. }
  200. \Log::info('$width'.$width.'$height'.$height);
  201. Image::make($real_path)->resize($width, $height)->save($real_path);
  202. }
  203. }
  204. return $this->_jsonMessage(200, ['message' => "上传成功", 'fileurl' => $url_path,'name'=>$md5_filename]);
  205. } catch (FileException $e) {
  206. return $this->_jsonMessage(500, ['message' => '上传失败']);
  207. }
  208. }
  209. /**
  210. * 删除附件
  211. *
  212. * @param $md5 string 删除文件的md5码
  213. * @return int 错误码or 0(成功)
  214. */
  215. public function deleteAttachment($md5) {
  216. $attachment = $this->_model->where(['md5' => $md5])->first();
  217. if (!$attachment) {
  218. return ErrorCode::ATTACHMENT_NOT_EXIST;
  219. }
  220. if (file_exists($attachment->path)) {
  221. if (@unlink($attachment->path)) {
  222. if ($attachment->delete()) {
  223. return 0;
  224. } else {
  225. return ErrorCode::ATTACHMENT_RECORD_DELETE_FAILED;
  226. }
  227. } else {
  228. return ErrorCode::ATTACHMENT_DELETE_FAILED;
  229. }
  230. } else {
  231. return ErrorCode::ATTACHMENT_NOT_EXIST;
  232. }
  233. }
  234. }