什么是MinIO?

MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

根据minio依赖实现文件上传下载

1.导入环境所需要的依赖
    <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--minio 8.2.2没有报依赖异常 新版报异常--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.26</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>
2.application.yml中进行minio的配置
minio:endpoint: http://192.168.233.123:9000 #Minio服务所在地址accessKey: minioadmin                 #连接Minio用户名secretKey: minioadmin                 #连接Minio密码bucketName: testadmin                 #Minio数据桶名称
3.MinIoConfig.class 配置类

此类主要做一些连接Minio实例化对象的配置

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author: yujie.li* @description* @date 2023/7/18*/
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinIoConfig {/*** 访问密钥*/@Value("${minio.accessKey}")private String accessKey;/*** 密钥*/@Value("${minio.secretKey}")private String secretKey;/*** 访问api Url*/@Value("${minio.endpoint}")private String endpoint;/*** 捅名称*/@Value("${minio.bucketName}")private String bucketName;/*** 创建MinIo客户端** @return*/@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}}
4.AjaxResult.class 实体类

此类对数据结果进行封装,返回报文

import java.util.HashMap;/*** 数据结果封装体 AjaxResult** @author yujie.li*/
public class AjaxResult extends HashMap<String, Object>
{private static final long serialVersionUID = 1L;/** 状态码 */public static final String CODE_TAG = "code";/** 返回内容 */public static final String MSG_TAG = "msg";/** 数据对象 */public static final String DATA_TAG = "data";/*** 初始化一个AjaxResult 对象*/public AjaxResult(){}/*** 初始化一个AjaxResult 对象** @param code 状态码* @param msg 返回内容*/public AjaxResult(int code, String msg){super.put(CODE_TAG, code);super.put(MSG_TAG, msg);}/*** 初始化一个AjaxResult 对象** @param code 状态码* @param msg 返回内容* @param data 数据对象*/public AjaxResult(int code, String msg, Object data){super.put(CODE_TAG, code);super.put(MSG_TAG, msg);if (!(data == null)){super.put(DATA_TAG, data);}}/*** 返回默认成功消息** @return 成功消息*/public static AjaxResult success(){return AjaxResult.success("操作成功");}/*** 返回成功消息** @param msg 返回内容* @return 成功消息*/public static AjaxResult success(String msg){return AjaxResult.success(msg, null);}/*** 返回成功数据* @param data 数据对象* @return*/public static AjaxResult success(Object data){return AjaxResult.success("操作成功", data);}/*** 初始化一个返回成功消息AjaxResult对象** @param msg 返回内容* @param data 数据对象* @return 成功消息*/public static AjaxResult success(String msg, Object data){return new AjaxResult(HttpStatus.SUCCESS, msg, data);}/*** 返回默认错误消息** @return*/public static AjaxResult error(){return AjaxResult.error("操作失败");}/*** 返回错误消息** @param msg 返回内容* @return 警告消息*/public static AjaxResult error(String msg){return AjaxResult.error(msg, null);}/*** 返回错误数据** @param code 状态码* @param msg 返回内容* @return 警告消息*/public static AjaxResult error(int code, String msg){return new AjaxResult(code, msg, null);}/*** 初始化一个返回错误消息AjaxResult对象** @param msg 返回内容* @param data 数据对象* @return 警告消息*/public static AjaxResult error(String msg, Object data){return new AjaxResult(HttpStatus.ERROR, msg, data);}}
5.HttpStatus.class 实体类

此类对返回Http状态码进行封装

/*** 返回HTTP状态码** @author yujie.li*/
public class HttpStatus {/*** 操作成功*/public static final int SUCCESS = 200;/*** 对象创建成功*/public static final int CREATED = 201;/*** 请求已经被接受*/public static final int ACCEPTED = 202;/*** 操作已经执行成功,但是没有返回数据*/public static final int NO_CONTENT = 204;/*** 资源已被移除*/public static final int MOVED_PERM = 301;/*** 重定向*/public static final int SEE_OTHER = 303;/*** 资源未被修改*/public static final int NOT_MODIFIED = 304;/*** 参数列表错误(缺少、格式不匹配)*/public static final int BAD_REQUEST = 400;/*** 未授权*/public static final int UNAUTHORIZED = 401;/*** 访问受限,授权过期*/public static final int FORBIDDEN = 403;/*** 资源,服务未找到*/public static final int NOT_FOUND = 404;/*** 未被允许http方法*/public static final int BAD_METHOD = 405;/*** 资源冲突,或者资源被锁*/public static final int CONFLICT = 409;/*** 不支持媒体类型数据*/public static final int UNSUPPORTED_TYPE = 415;/*** 系统内部错误*/public static final int ERROR = 500;/*** 未实现相应接口*/public static final int NOT_IMPLEMENTED = 501;
}
6. ServletUtils.class 配置类

此类返回 JSON 数据的方法

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class ServletUtils {public static void renderString(HttpServletResponse response, String json) throws IOException {response.setContentType("application/json");response.setCharacterEncoding("UTF-8");try (PrintWriter writer = response.getWriter()) {writer.write(json);writer.flush();}}
}
7.MinIoUtil.class 工具类

此工具类中包含上传与下载的方法

import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author: yujie.li* @description* @date 2023/7/18*/
@Component
public class MinIOUtil {@Autowiredprivate MinioClient minioClient;/*** 捅名称*/@Value("${minio.bucketName}")private String bucketName;/*** putObject上传文件** @param file 文件* @return filePath*/public String putObject(MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException {//文件名String originalFilename = file.getOriginalFilename();//文件流InputStream inputStream = file.getInputStream();//文件大小long size = file.getSize();//文件路径String filePath = createFilePath(originalFilename);System.out.println(filePath+"\t文件路径");//存储方法 putObjectminioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filePath).stream(inputStream, size, -1).contentType(file.getContentType()).build());return filePath;}/*** 下载文件** @param filePath 文件路径*/public void getObject(HttpServletResponse httpServletResponse, String filePath) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {String fileName = getFileName(filePath);InputStream inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filePath).build());downloadFile(httpServletResponse, inputStream, fileName);}/*** 获取文件路径** @param originalFilename 原始文件名称* @return FilePath*/public String createFilePath(String originalFilename) {return new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + originalFilename;}/*** 根据文件路径获取文件名称** @param filePath 文件路径* @return 文件名*/public String getFileName(String filePath) {String[] split = StringUtils.split(filePath, "/");return split[split.length - 1];}/*** 下载文件** @param httpServletResponse httpServletResponse* @param inputStream         inputStream* @param fileName            文件名* @throws IOException IOException*/public void downloadFile(HttpServletResponse httpServletResponse, InputStream inputStream, String fileName) throws IOException {//设置响应头信息,告诉前端浏览器下载文件httpServletResponse.setContentType("application/octet-stream;charset=UTF-8");httpServletResponse.setCharacterEncoding("UTF-8");httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));//获取输出流进行写入数据OutputStream outputStream = httpServletResponse.getOutputStream();// 将输入流复制到输出流byte[] buffer = new byte[4096];int bytesRead = -1;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}// 关闭流资源inputStream.close();outputStream.close();}
}
8. MinioController.class 控制类
import com.alibaba.fastjson2.JSON;
import com.lyj.msg.AjaxResult;
import com.lyj.msg.HttpStatus;
import com.lyj.utils.MinIOUtil;
import com.lyj.utils.ServletUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author yujie.li* @description* @date 2023/7/18*/
@RestController
@Slf4j
public class MinioController {@Autowiredprivate MinIOUtil minioUtil;@PostMapping("/upload")public AjaxResult upload(@RequestPart MultipartFile file) {String filePath;try {filePath = minioUtil.putObject(file);} catch (Exception e) {e.printStackTrace();return AjaxResult.error("上传失败");}return AjaxResult.success(filePath);}@GetMapping("/download")public void download(HttpServletResponse response, @RequestParam(value = "filepath") String filepath) throws IOException {try {minioUtil.getObject(response, filepath);} catch (Exception e) {e.printStackTrace();log.error("下载失败", e);response.reset();AjaxResult result = new AjaxResult(HttpStatus.ERROR, e.getMessage());String json = JSON.toJSONString(result);ServletUtils.renderString(response, json);}}
}
ps.遇到的坑

1.需要将自己所创建的Buckets桶权限设置为public

2.桶的名称需要与yml配置类中bucketName一致

3. 测试下载接口时,传递的参数值为桶中的文件路径即可,不需要在加桶的名称,例如(testadmin/1.png)

尾注:每一行代码 都是改变世界的能量 愿你每一次的运行 都是发自内心的快乐

SpringBoot整合Minio(实现上传与下载)相关推荐

  1. 【SpringBoot】:springboot整合FTP文件上传与下载功能

    导入依赖包 <dependency><groupId>commons-net</groupId><artifactId>commons-net</ ...

  2. SpringBoot+MongoDB GridFS文件上传、下载、预览实战

    SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...

  3. springboot整合amazonS3,封装上传文件接口

    之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...

  4. Springboot前后端分离上传、下载压缩包、查看文件

    Controller层: /*** 保存附件按钮* @param file 附件* @return 附件路径**/@PostMapping(value = "/upload")Ob ...

  5. SpringBoot下文件上传与下载的实现

    原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...

  6. springboot文件上传和下载(批量/单个)

    前言 用springboot + jpa,批量上传.下载,一般批量下载处理方式都是将多个文件压缩成一个压缩包,然后在下载,主要的坑在于本地上传和下载都正常,部署在服务器上会出现各种错误,比如找不到路径 ...

  7. springboot整合minio上传文件

    1.安装minio 这里采用docker进行安装. 搜索该镜像:docker search minio 找到了镜像:minio/minio 拉取镜像:docker pull minio/minio 启 ...

  8. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

  9. MinIO入门-02 SpringBoot 整合MinIO并实现文件上传

    SpringBoot 整合MinIO并实现文件上传 1.依赖 <!-- https://mvnrepository.com/artifact/io.minio/minio --> < ...

  10. SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作

    首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...

最新文章

  1. sap data service安装方法
  2. Useful code snippet to parse the key value pairs in URL
  3. android USB host编程
  4. QQ浏览器怎么截取整个网页 QQ浏览器完整截取网页的方法
  5. [HDU5727]Necklace(二分图最大匹配,枚举)
  6. Android一帧一帧的动画
  7. 无线鼠标全国产化电子元件推荐方案
  8. win10怎样修改密码及忘记密码了怎么办
  9. Golang可能会踩的58个坑之高级篇
  10. 2022-09-29 C++并发编程(二十八)
  11. PHP 使用TCPDF插件生成pdf以及pdf的中文处理
  12. Vue实现图形化积木式编程(十)
  13. 使用 easypoi 导出 excel 实现动态列,完美解决!
  14. 【大学物理·静止电荷的电场】静电场的高斯定理
  15. 系统架构设计笔记(103)—— 标准化知识
  16. layim之添加好友分组
  17. 74hc和74ls的区别
  18. 华为自带的输入法就有五大黑科技!现在知道不算晚
  19. 普通人看山河令VS女程序媛看山河令
  20. 微信朋友圈在服务器多久刷新,官方回复微信朋友圈不能刷新为什么微信朋友圈不能刷新...

热门文章

  1. [Luogu P3312] [BZOJ 3529] [SDOI2014]数表
  2. go语言的魔幻旅程14-反射
  3. IntelliJ IDEAapplication.yml不显示小叶子的解决方法
  4. google 响应式编程 agera 试用
  5. PMP考试 过程管理计划与过程分析的区别和联系
  6. 微软全球副总裁沈向洋畅谈“探寻企业成功之路”
  7. CCF非专业级软件能力认证
  8. 有了这个神器,再也不怕shell写得不对了
  9. echart地图不显示问题
  10. Windows Phone 7将胜出的五条论据