84dd6ee8c1793dd87c4e31415e6aa9f25ddf83f8.svn-base 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package org.jeecg.common.util;
  2. import io.minio.*;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.jeecg.common.util.filter.FileTypeFilter;
  5. import org.jeecg.common.util.filter.StrAttackFilter;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.InputStream;
  8. import java.net.URLDecoder;
  9. /**
  10. * minio文件上传工具类
  11. */
  12. @Slf4j
  13. public class MinioUtil {
  14. private static String minioUrl;
  15. private static String minioName;
  16. private static String minioPass;
  17. private static String bucketName;
  18. public static void setMinioUrl(String minioUrl) {
  19. MinioUtil.minioUrl = minioUrl;
  20. }
  21. public static void setMinioName(String minioName) {
  22. MinioUtil.minioName = minioName;
  23. }
  24. public static void setMinioPass(String minioPass) {
  25. MinioUtil.minioPass = minioPass;
  26. }
  27. public static void setBucketName(String bucketName) {
  28. MinioUtil.bucketName = bucketName;
  29. }
  30. public static String getMinioUrl() {
  31. return minioUrl;
  32. }
  33. public static String getBucketName() {
  34. return bucketName;
  35. }
  36. private static MinioClient minioClient = null;
  37. /**
  38. * 上传文件
  39. * @param file
  40. * @return
  41. */
  42. public static String upload(MultipartFile file, String bizPath, String customBucket) {
  43. String file_url = "";
  44. //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
  45. bizPath=StrAttackFilter.filter(bizPath);
  46. //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
  47. String newBucket = bucketName;
  48. if(oConvertUtils.isNotEmpty(customBucket)){
  49. newBucket = customBucket;
  50. }
  51. try {
  52. initMinio(minioUrl, minioName,minioPass);
  53. // 检查存储桶是否已经存在
  54. if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
  55. log.info("Bucket already exists.");
  56. } else {
  57. // 创建一个名为ota的存储桶
  58. minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
  59. log.info("create a new bucket.");
  60. }
  61. //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
  62. FileTypeFilter.fileTypeFilter(file);
  63. //update-end-author:liusq date:20210809 for: 过滤上传文件类型
  64. InputStream stream = file.getInputStream();
  65. // 获取文件名
  66. String orgName = file.getOriginalFilename();
  67. if("".equals(orgName)){
  68. orgName=file.getName();
  69. }
  70. orgName = CommonUtils.getFileName(orgName);
  71. String objectName = bizPath+"/"
  72. +( orgName.indexOf(".")==-1
  73. ?orgName + "_" + System.currentTimeMillis()
  74. :orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."))
  75. );
  76. // 使用putObject上传一个本地文件到存储桶中。
  77. if(objectName.startsWith("/")){
  78. objectName = objectName.substring(1);
  79. }
  80. PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
  81. .bucket(newBucket)
  82. .contentType("application/octet-stream")
  83. .stream(stream,stream.available(),-1).build();
  84. minioClient.putObject(objectArgs);
  85. stream.close();
  86. file_url = minioUrl+newBucket+"/"+objectName;
  87. }catch (Exception e){
  88. log.error(e.getMessage(), e);
  89. }
  90. return file_url;
  91. }
  92. /**
  93. * 文件上传
  94. * @param file
  95. * @param bizPath
  96. * @return
  97. */
  98. public static String upload(MultipartFile file, String bizPath) {
  99. return upload(file,bizPath,null);
  100. }
  101. /**
  102. * 获取文件流
  103. * @param bucketName
  104. * @param objectName
  105. * @return
  106. */
  107. public static InputStream getMinioFile(String bucketName,String objectName){
  108. InputStream inputStream = null;
  109. try {
  110. initMinio(minioUrl, minioName, minioPass);
  111. GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName)
  112. .bucket(bucketName).build();
  113. inputStream = minioClient.getObject(objectArgs);
  114. } catch (Exception e) {
  115. log.info("文件获取失败" + e.getMessage());
  116. }
  117. return inputStream;
  118. }
  119. /**
  120. * 删除文件
  121. * @param bucketName
  122. * @param objectName
  123. * @throws Exception
  124. */
  125. public static void removeObject(String bucketName, String objectName) {
  126. try {
  127. initMinio(minioUrl, minioName,minioPass);
  128. RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName)
  129. .bucket(bucketName).build();
  130. minioClient.removeObject(objectArgs);
  131. }catch (Exception e){
  132. log.info("文件删除失败" + e.getMessage());
  133. }
  134. }
  135. /**
  136. * 获取文件外链
  137. * @param bucketName
  138. * @param objectName
  139. * @param expires
  140. * @return
  141. */
  142. public static String getObjectURL(String bucketName, String objectName, Integer expires) {
  143. initMinio(minioUrl, minioName,minioPass);
  144. try{
  145. GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName)
  146. .bucket(bucketName)
  147. .expiry(expires).build();
  148. String url = minioClient.getPresignedObjectUrl(objectArgs);
  149. return URLDecoder.decode(url,"UTF-8");
  150. }catch (Exception e){
  151. log.info("文件路径获取失败" + e.getMessage());
  152. }
  153. return null;
  154. }
  155. /**
  156. * 初始化客户端
  157. * @param minioUrl
  158. * @param minioName
  159. * @param minioPass
  160. * @return
  161. */
  162. private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {
  163. if (minioClient == null) {
  164. try {
  165. minioClient = MinioClient.builder()
  166. .endpoint(minioUrl)
  167. .credentials(minioName, minioPass)
  168. .build();
  169. } catch (Exception e) {
  170. e.printStackTrace();
  171. }
  172. }
  173. return minioClient;
  174. }
  175. /**
  176. * 上传文件到minio
  177. * @param stream
  178. * @param relativePath
  179. * @return
  180. */
  181. public static String upload(InputStream stream,String relativePath) throws Exception {
  182. initMinio(minioUrl, minioName,minioPass);
  183. if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
  184. log.info("Bucket already exists.");
  185. } else {
  186. // 创建一个名为ota的存储桶
  187. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  188. log.info("create a new bucket.");
  189. }
  190. PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath)
  191. .bucket(bucketName)
  192. .contentType("application/octet-stream")
  193. .stream(stream,stream.available(),-1).build();
  194. minioClient.putObject(objectArgs);
  195. stream.close();
  196. return minioUrl+bucketName+"/"+relativePath;
  197. }
  198. }