增加依赖:

  1. <properties>
  2. <minio.version>4.0.0</minio.version>
  3. </properties>
  4. <dependency>
  5. <groupId>io.minio</groupId>
  6. <artifactId>minio</artifactId>
  7. <version>${minio.version}</version>
  8. </dependency>

增加工具类

  1. public class MinioClientUtils {
  2. private static final Logger LOGGER = LoggerFactory.getLogger(MinioClientUtils.class);
  3. private static MinioClientUtils minioClientUtils;
  4. private MinioClient minioClient;
  5. private static int RETRY_NUM = 3;
  6. private static final String bucketPublicPolicy = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Resource\":[\"arn:aws:s3:::test\"],\"Sid\":\"\"},{\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Resource\":[\"arn:aws:s3:::test/*\"],\"Sid\":\"\"}]}";
  7. public static MinioClientUtils getInstance() {
  8. if (null != minioClientUtils) {
  9. return minioClientUtils;
  10. }
  11. synchronized (MinioClientUtils.class) {
  12. if (null == minioClientUtils) {
  13. minioClientUtils = new MinioClientUtils();
  14. }
  15. }
  16. return minioClientUtils;
  17. }
  18. private MinioClientUtils() {
  19. init();
  20. }
  21. private void init() {
  22. final Configuration configuration = initConfiguration();
  23. String url = configuration.getString("minio.url", StringUtils.EMPTY);
  24. String username = configuration.getString("minio.name", StringUtils.EMPTY);
  25. String password = configuration.getString("minio.password", StringUtils.EMPTY);
  26. String region = configuration.getString("minio.region", StringUtils.EMPTY);
  27. try {
  28. if (StringUtils.isNotEmpty(url) && StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) {
  29. minioClient = new MinioClient(url, username, password, false);
  30. }
  31. } catch (Exception e) {
  32. LOGGER.error("restClient.close occur error", e);
  33. }
  34. }
  35. public boolean createBucketPublic(String bucketName) {
  36. boolean isCreated;
  37. try {
  38. // if (minioClient.bucketExists(bucketName)) {
  39. // isCreated = false;
  40. // }
  41. minioClient.makeBucket("buzi");
  42. //minioClient.setBucketPolicy(bucketName, bucketPublicPolicy);
  43. isCreated = true;
  44. } catch (Exception e) {
  45. isCreated = false;
  46. LOGGER.error("createBucketPublic", e);
  47. e.printStackTrace();
  48. }
  49. return isCreated;
  50. }
  51. public String uploadJpegFile(String bucketName, String minioPath, String jpgFilePath) {
  52. return uploadFile(bucketName, minioPath, jpgFilePath, MediaType.IMAGE_JPEG_VALUE);
  53. }
  54. public String uploadJpegStream(String bucketName, String minioPath, InputStream inputStream) {
  55. return uploadStream(bucketName, minioPath, inputStream, MediaType.IMAGE_JPEG_VALUE);
  56. }
  57. public String uploadStream(String bucketName, String minioFilePath, InputStream inputStream, String mediaType) {
  58. LOGGER.info("uploadStream for bucketName={} minioFilePath={} inputStream.getclass={}, mediaType={}", bucketName,
  59. minioFilePath, inputStream.getClass(), mediaType);
  60. if (StringUtils.isBlank(mediaType)) {
  61. mediaType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
  62. }
  63. try {
  64. putObjectWithRetry(bucketName, minioFilePath, inputStream, mediaType);
  65. return cleanUrlByRemoveIp(minioClient.getObjectUrl(bucketName, minioFilePath));
  66. } catch (Exception e) {
  67. LOGGER.error("uploadStream occur error:", e);
  68. throw new RuntimeException(e);
  69. }
  70. }
  71. public String uploadFile(String bucketName, String minioFilePath, String localFile, String mediaType) {
  72. LOGGER.info("uploadFile for bucketName={} minioFilePath={} localFile={}, mediaType={}", bucketName,
  73. minioFilePath, localFile, mediaType);
  74. if (StringUtils.isBlank(mediaType)) {
  75. mediaType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
  76. }
  77. try {
  78. putObjectWithRetry(bucketName, minioFilePath, localFile, mediaType);
  79. return cleanUrlByRemoveIp(minioClient.getObjectUrl(bucketName, minioFilePath));
  80. } catch (Exception e) {
  81. LOGGER.error("uploadFile occur error:", e);
  82. throw new RuntimeException(e);
  83. }
  84. }
  85. public List<MinioEntity> listFilesSwap(String bucketName, String prefix, boolean recursive) {
  86. LOGGER.info("list files for bucketName={} prefix={} recursive={}", bucketName, prefix, recursive);
  87. return swapResultToEntityList(minioClient.listObjects(bucketName, prefix, recursive));
  88. }
  89. public Iterable<Result<Item>> listFiles(String bucketName, String prefix, boolean recursive) {
  90. LOGGER.info("list files for bucketName={} prefix={} recursive={}", bucketName, prefix, recursive);
  91. return minioClient.listObjects(bucketName, prefix, recursive);
  92. }
  93. public List<MinioEntity> listFilesByBucketNameSwap(String bucketName) {
  94. LOGGER.info("listFilesByBucketName for bucketName={}", bucketName);
  95. return swapResultToEntityList(minioClient.listObjects(bucketName, null, true));
  96. }
  97. public Iterable<Result<Item>> listFilesByBucketName(String bucketName) {
  98. LOGGER.info("listFilesByBucketName for bucketName={}", bucketName);
  99. return minioClient.listObjects(bucketName, null, true);
  100. }
  101. public Iterable<Result<Item>> listFilesByBucketAndPrefix(String bucketName, String prefix) {
  102. LOGGER.info("listFilesByBucketAndPrefix for bucketName={} and prefix={}", bucketName, prefix);
  103. return minioClient.listObjects(bucketName, prefix, true);
  104. }
  105. public List<MinioEntity> listFilesByBucketAndPrefixSwap(String bucketName, String prefix) {
  106. LOGGER.info("listFilesByBucketAndPrefix for bucketName={} and prefix={}", bucketName, prefix);
  107. return swapResultToEntityList(minioClient.listObjects(bucketName, prefix, true));
  108. }
  109. private Configuration initConfiguration() {
  110. ClassLoader classLoader = MinioClientUtils.class.getClassLoader();
  111. if (null == classLoader) {
  112. classLoader = Thread.currentThread().getContextClassLoader();
  113. }
  114. Configuration configuration = null;
  115. URL resource = classLoader.getResource("minio.properties");
  116. if (null == resource) {
  117. LOGGER.error("can not find minio.properties");
  118. throw new RuntimeException("can not find minio.properties");
  119. }
  120. try {
  121. configuration = new PropertiesConfiguration(resource);
  122. } catch (ConfigurationException e) {
  123. LOGGER.error("load properties from url={} occur error", resource.toString());
  124. throw new RuntimeException("load properties from url=" + resource.toString() + " occur error", e);
  125. }
  126. return configuration;
  127. }
  128. private MinioEntity swapResultToEntity(Result<Item> result) {
  129. MinioEntity minioEntity = new MinioEntity();
  130. try {
  131. if (result.get() != null) {
  132. Item item = result.get();
  133. minioEntity.setObjectName(cleanUrlByRemoveIp(item.objectName()));
  134. minioEntity.setDir(item.isDir());
  135. minioEntity.setEtag(item.etag());
  136. minioEntity.setLastModified(item.lastModified());
  137. minioEntity.setSize(item.size());
  138. minioEntity.setStorageClass(item.storageClass());
  139. }
  140. } catch (Exception e) {
  141. LOGGER.error("UrlUtils error, e={}", e.getMessage());
  142. }
  143. return minioEntity;
  144. }
  145. private List<MinioEntity> swapResultToEntityList(Iterable<Result<Item>> results) {
  146. List<MinioEntity> minioEntities = new ArrayList<>();
  147. for (Result<Item> result : results) {
  148. minioEntities.add(swapResultToEntity(result));
  149. }
  150. return minioEntities;
  151. }
  152. public void putObjectWithRetry(String bucketName, String objectName, InputStream stream, String contentType) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InvalidArgumentException, NoResponseException, InvalidBucketNameException, XmlPullParserException, InternalException {
  153. int current = 0;
  154. boolean isSuccess = false;
  155. while (!isSuccess && current < RETRY_NUM) {
  156. try {
  157. minioClient.putObject(bucketName, objectName, stream, contentType);
  158. isSuccess = true;
  159. } catch (ErrorResponseException e) {
  160. LOGGER.warn("[minio] putObject stream, ErrorResponseException occur for time =" + current, e);
  161. current++;
  162. }
  163. }
  164. if (current == RETRY_NUM) {
  165. LOGGER.error("[minio] putObject, backetName={}, objectName={}, failed finally!");
  166. }
  167. }
  168. public void putObjectWithRetry(String bucketName, String objectName, String fileName, String contentType) throws InvalidBucketNameException, NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, NoResponseException, XmlPullParserException, ErrorResponseException, InternalException, InvalidArgumentException, InsufficientDataException {
  169. int current = 0;
  170. boolean isSuccess = false;
  171. while (!isSuccess && current < RETRY_NUM) {
  172. try {
  173. minioClient.putObject(bucketName, objectName, fileName, contentType);
  174. isSuccess = true;
  175. } catch (ErrorResponseException e) {
  176. current++;
  177. LOGGER.debug("[minio] putObject file, ErrorResponseException occur!");
  178. }
  179. }
  180. if (current == RETRY_NUM) {
  181. LOGGER.error("[minio] putObject, backetName={}, objectName={}, failed finally!");
  182. }
  183. }
  184. public static void main(String[] args) {
  185. MinioClientUtils.getInstance().createBucketPublic("helo");
  186. }
  187. }
  188. }

文件上传

  1. public void upload(@RequestParam("file") MulipartFile data,String bucketName,String path){
  2. String fileName = data.getOriginalFilename();
  3. String filePath = path+"/"+fileName;
  4. String contentType = data.getContentType();
  5. InputStream inputStram = data.getInputStream();
  6. MinioClientUtils minioClientUtils = MinioCLinetUtils.getInstance();
  7. minioClientUtils.uploadStream(
  8. bucketName,
  9. filePath,
  10. inputStream,
  11. contentType
  12. );
  13. }