Attachment.php 12 KB

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