• springboot整合minio上传文件


    1.安装minio

    这里采用docker进行安装。

    搜索该镜像:docker search minio

    找到了镜像:minio/minio

    拉取镜像:docker pull minio/minio

    启动镜像:

    docker run --name minio -p 9090:9000 -p 9999:9999 -d \
    --restart=always -e \
    "MINIO_ROOT_USER=minioadmin" \
    -e "MINIO_ROOT_PASSWORD=minioadmin123?" \
    -v /home/minio/data:/data \
    -v /home/minio/config:/root/.minio minio/minio server /data --console-address '0.0.0.0:9999'
     

    浏览器访问minio的控制台:

    http://ip:port

    访问到网页如下: 

    2.配置minio

    1.创建一个放图片的目录

    登录网页进去:

    点击左侧Buckets页面,然后点击右边的 Create Bucket 去创建一个目录,这个目录,如下,我创建了一个imgs,这个目录用来放上传的图片,需要记住这个目录,代码里面需要用

     

    2.创建上传文件需要的key

     需要把这两个key复制出来,代码里面需要用,就相当于账户密码之类的

    3.springboot整合minio

    1. 导入maven

    1. <dependency>
    2. <groupId>io.miniogroupId>
    3. <artifactId>minioartifactId>
    4. <version>8.2.1version>
    5. dependency>

    2.配置yml文件

    # minio文件系统配置
    minio:
      # minio配置的地址,端口9090
      url: http://xxx.xx.xx.xx:9090
      # 账号
      accessKey: RKGZKAUGHKDY0XVN
      # 密码
      secretKey: HmTlAJoll7V0OjfBoyKmsIGF
      # MinIO桶名字
      bucketName: imgs

    3.代码部分

    MinioUtil.java
    1. package com.tn.humanenv.common.utils;
    2. import io.minio.*;
    3. import io.minio.messages.DeleteError;
    4. import io.minio.messages.DeleteObject;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Component;
    7. import org.springframework.util.FastByteArrayOutputStream;
    8. import org.springframework.web.multipart.MultipartFile;
    9. import javax.servlet.ServletOutputStream;
    10. import javax.servlet.http.HttpServletResponse;
    11. import java.util.List;
    12. import java.util.stream.Collectors;
    13. /**
    14. * minio存储
    15. */
    16. @Component
    17. public class MinioUtil {
    18. @Autowired
    19. private MinioClient minioClient;
    20. /**
    21. * @author xhw
    22. * @生成文件名
    23. * @param fileName
    24. * @return
    25. */
    26. public String getUUIDFileName(String fileName) {
    27. int idx = fileName.lastIndexOf(".");
    28. String extention = fileName.substring(idx);
    29. String newFileName = DateUtils.getDateTo_().replace("-","")+UUID.randomUUID().toString().replace("-","")+extention;
    30. return newFileName;
    31. }
    32. /**
    33. * 查看存储bucket是否存在
    34. *
    35. * @param bucketName 存储bucket
    36. * @return boolean
    37. */
    38. public Boolean bucketExists(String bucketName) {
    39. Boolean found;
    40. try {
    41. found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    42. } catch (Exception e) {
    43. e.printStackTrace();
    44. return false;
    45. }
    46. return found;
    47. }
    48. /**
    49. * 创建存储bucket
    50. *
    51. * @param bucketName 存储bucket名称
    52. * @return Boolean
    53. */
    54. public Boolean makeBucket(String bucketName) {
    55. try {
    56. minioClient.makeBucket(MakeBucketArgs.builder()
    57. .bucket(bucketName)
    58. .build());
    59. } catch (Exception e) {
    60. e.printStackTrace();
    61. return false;
    62. }
    63. return true;
    64. }
    65. /**
    66. * 删除存储bucket
    67. *
    68. * @param bucketName 存储bucket名称
    69. * @return Boolean
    70. */
    71. public Boolean removeBucket(String bucketName) {
    72. try {
    73. minioClient.removeBucket(RemoveBucketArgs.builder()
    74. .bucket(bucketName)
    75. .build());
    76. } catch (Exception e) {
    77. e.printStackTrace();
    78. return false;
    79. }
    80. return true;
    81. }
    82. /**
    83. * 文件上传
    84. *
    85. * @param file 文件
    86. * @param bucketName 存储bucket
    87. * @return Boolean
    88. */
    89. public Boolean upload(MultipartFile file, String fileName, String bucketName) {
    90. try {
    91. PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)
    92. .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
    93. //文件名称相同会覆盖
    94. minioClient.putObject(objectArgs);
    95. } catch (Exception e) {
    96. e.printStackTrace();
    97. return false;
    98. }
    99. return true;
    100. }
    101. /**
    102. * 文件下载
    103. *
    104. * @param bucketName 存储bucket名称
    105. * @param fileName 文件名称
    106. * @param res response
    107. * @return Boolean
    108. */
    109. public void download(String bucketName, String fileName, HttpServletResponse res) {
    110. GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
    111. .object(fileName).build();
    112. try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
    113. byte[] buf = new byte[1024];
    114. int len;
    115. try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
    116. while ((len = response.read(buf)) != -1) {
    117. os.write(buf, 0, len);
    118. }
    119. os.flush();
    120. byte[] bytes = os.toByteArray();
    121. res.setCharacterEncoding("utf-8");
    122. //设置强制下载不打开
    123. res.setContentType("application/force-download");
    124. res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
    125. try (ServletOutputStream stream = res.getOutputStream()) {
    126. stream.write(bytes);
    127. stream.flush();
    128. }
    129. }
    130. } catch (Exception e) {
    131. e.printStackTrace();
    132. }
    133. }
    134. /**
    135. * 查看文件对象
    136. *
    137. * @param bucketName 存储bucket名称
    138. * @return 存储bucket内文件对象信息
    139. */
    140. /* public List listObjects(String bucketName) {
    141. Iterable> results = minioClient.listObjects(
    142. ListObjectsArgs.builder().bucket(bucketName).build());
    143. List objectItems = new ArrayList<>();
    144. try {
    145. for (Result result : results) {
    146. Item item = result.get();
    147. ObjectItem objectItem = new ObjectItem();
    148. objectItem.setObjectName(item.objectName());
    149. objectItem.setSize(item.size());
    150. objectItems.add(objectItem);
    151. }
    152. } catch (Exception e) {
    153. e.printStackTrace();
    154. return null;
    155. }
    156. return objectItems;
    157. }*/
    158. /**
    159. * 批量删除文件对象
    160. *
    161. * @param bucketName 存储bucket名称
    162. * @param objects 对象名称集合
    163. */
    164. public Iterable> removeObjects(String bucketName, List objects) {
    165. List dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
    166. Iterable> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
    167. return results;
    168. }
    169. }
    SysFileController.java
    1. package com.tn.humanenv.controller;
    2. import com.tn.humanenv.common.controller.BaseController;
    3. import com.tn.humanenv.common.domain.AjaxResult;
    4. import com.tn.humanenv.common.utils.StringUtils;
    5. import com.tn.humanenv.service.SysFileService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.RequestMethod;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import org.springframework.web.multipart.MultipartFile;
    11. import java.util.Map;
    12. /**
    13. * @author xhw
    14. * @desc 文件上传
    15. * @date 2022/09/04
    16. */
    17. @RestController
    18. @RequestMapping("/file")
    19. public class SysFileController extends BaseController {
    20. @Autowired
    21. private SysFileService sysFileService;
    22. /**
    23. * 图片上传minio
    24. *
    25. * @param file 图片文件
    26. * @return 返回
    27. */
    28. @RequestMapping(value = "/upload", method = RequestMethod.POST)
    29. public AjaxResult uploadFileMinio(MultipartFile file) {
    30. Map map = sysFileService.uploadFileMinio(file);
    31. if (StringUtils.isNotNull(map)) {
    32. return AjaxResult.success(map);
    33. }
    34. return error("上传失败");
    35. }
    36. }

    SysFileServiceImpl.java
    1. package com.tn.humanenv.service.Impl;
    2. import com.tn.humanenv.common.config.MinioConfig;
    3. import com.tn.humanenv.common.utils.MinioUtil;
    4. import com.tn.humanenv.service.SysFileService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import org.springframework.web.multipart.MultipartFile;
    8. import java.util.HashMap;
    9. import java.util.Map;
    10. @Service
    11. public class SysFileServiceImpl implements SysFileService {
    12. @Autowired
    13. private MinioConfig minioConfig;
    14. @Autowired
    15. private MinioUtil minioUtil;
    16. @Override
    17. public Map uploadFileMinio(MultipartFile file) {
    18. boolean flag = false;
    19. if (file.isEmpty()) {
    20. throw new RuntimeException("文件不存在!");
    21. }
    22. // 判断存储桶是否存在
    23. if (!minioUtil.bucketExists(minioConfig.getBucketName())) {
    24. minioUtil.makeBucket(minioConfig.getBucketName());
    25. }
    26. // 生成文件名
    27. String newFileName = minioUtil.getUUIDFileName(file.getOriginalFilename());
    28. try {
    29. // 上传文件
    30. flag = minioUtil.upload(file, newFileName, minioConfig.getBucketName());
    31. } catch (Exception e) {
    32. return null;
    33. }
    34. // 判断是否上传成功,成功就返回url,不成功就返回null
    35. Map map = new HashMap<>();
    36. map.put("url",minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + newFileName);
    37. map.put("fileName",newFileName);
    38. if (flag){
    39. return map;
    40. }
    41. return null;
    42. }
    43. }
    SysFileService.java
    1. package com.tn.humanenv.service;
    2. import org.springframework.web.multipart.MultipartFile;
    3. import java.util.Map;
    4. public interface SysFileService {
    5. public Map uploadFileMinio(MultipartFile file);
    6. }
    MinioConfig.java
    1. package com.tn.humanenv.common.config;
    2. import io.minio.MinioClient;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. @Configuration
    7. @ConfigurationProperties(prefix = "minio")
    8. public class MinioConfig {
    9. /**
    10. * 服务地址
    11. */
    12. public String url;
    13. /**
    14. * 用户名
    15. */
    16. public String accessKey;
    17. /**
    18. * 密码
    19. */
    20. public String secretKey;
    21. /**
    22. * 存储桶名称
    23. */
    24. public String bucketName;
    25. // "如果是true,则用的是https而不是http,默认值是true"
    26. public static Boolean secure = false;
    27. public String getUrl() {
    28. return url;
    29. }
    30. public void setUrl(String url) {
    31. this.url = url;
    32. }
    33. public String getAccessKey() {
    34. return accessKey;
    35. }
    36. public void setAccessKey(String accessKey) {
    37. this.accessKey = accessKey;
    38. }
    39. public String getSecretKey() {
    40. return secretKey;
    41. }
    42. public void setSecretKey(String secretKey) {
    43. this.secretKey = secretKey;
    44. }
    45. public String getBucketName() {
    46. return bucketName;
    47. }
    48. public void setBucketName(String bucketName) {
    49. this.bucketName = bucketName;
    50. }
    51. public static Boolean getSecure() {
    52. return secure;
    53. }
    54. public static void setSecure(Boolean secure) {
    55. MinioConfig.secure = secure;
    56. }
    57. @Bean
    58. public MinioClient getMinioClient() {
    59. return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    60. }
    61. }

    4.测试上传图片

    调用接口如下: 

     

    把链接拿出来浏览器访问如下:

    上传excel文件如下: 

    访问该地址,直接就下载了这个excel文件:

     

    如上。

     

  • 相关阅读:
    含文档+PPT+源码等]javaweb企业员工信息管理系统的设计与实现薪酬|请假|薪资|工资
    Nginx安装
    时序预测 | MATLAB实现BiLSTM时间序列未来多步预测
    Spring Boot项目中使用jdbctemplate 操作MYSQL数据库
    内存优化总结: ptmalloc、tcmalloc 和 jemalloc
    小米软开一面
    全面开启 BI PaaS|衡石十月头条
    智能化升级 —— 巧妙运用AI工具,提升职场与学习中的个人竞争力
    20221106 今天的世界发生了什么
    Auto.js中的一般全局函数
  • 原文地址:https://blog.csdn.net/weixin_38972910/article/details/126695785