SpringBoot整合Minio(实现上传与下载)
什么是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(实现上传与下载)相关推荐
- 【SpringBoot】:springboot整合FTP文件上传与下载功能
导入依赖包 <dependency><groupId>commons-net</groupId><artifactId>commons-net</ ...
- SpringBoot+MongoDB GridFS文件上传、下载、预览实战
SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...
- springboot整合amazonS3,封装上传文件接口
之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...
- Springboot前后端分离上传、下载压缩包、查看文件
Controller层: /*** 保存附件按钮* @param file 附件* @return 附件路径**/@PostMapping(value = "/upload")Ob ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- springboot文件上传和下载(批量/单个)
前言 用springboot + jpa,批量上传.下载,一般批量下载处理方式都是将多个文件压缩成一个压缩包,然后在下载,主要的坑在于本地上传和下载都正常,部署在服务器上会出现各种错误,比如找不到路径 ...
- springboot整合minio上传文件
1.安装minio 这里采用docker进行安装. 搜索该镜像:docker search minio 找到了镜像:minio/minio 拉取镜像:docker pull minio/minio 启 ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...
- MinIO入门-02 SpringBoot 整合MinIO并实现文件上传
SpringBoot 整合MinIO并实现文件上传 1.依赖 <!-- https://mvnrepository.com/artifact/io.minio/minio --> < ...
- SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作
首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...
最新文章
- sap data service安装方法
- Useful code snippet to parse the key value pairs in URL
- android USB host编程
- QQ浏览器怎么截取整个网页 QQ浏览器完整截取网页的方法
- [HDU5727]Necklace(二分图最大匹配,枚举)
- Android一帧一帧的动画
- 无线鼠标全国产化电子元件推荐方案
- win10怎样修改密码及忘记密码了怎么办
- Golang可能会踩的58个坑之高级篇
- 2022-09-29 C++并发编程(二十八)
- PHP 使用TCPDF插件生成pdf以及pdf的中文处理
- Vue实现图形化积木式编程(十)
- 使用 easypoi 导出 excel 实现动态列,完美解决!
- 【大学物理·静止电荷的电场】静电场的高斯定理
- 系统架构设计笔记(103)—— 标准化知识
- layim之添加好友分组
- 74hc和74ls的区别
- 华为自带的输入法就有五大黑科技!现在知道不算晚
- 普通人看山河令VS女程序媛看山河令
- 微信朋友圈在服务器多久刷新,官方回复微信朋友圈不能刷新为什么微信朋友圈不能刷新...
热门文章
- [Luogu P3312] [BZOJ 3529] [SDOI2014]数表
- go语言的魔幻旅程14-反射
- IntelliJ IDEAapplication.yml不显示小叶子的解决方法
- google 响应式编程 agera 试用
- PMP考试 过程管理计划与过程分析的区别和联系
- 微软全球副总裁沈向洋畅谈“探寻企业成功之路”
- CCF非专业级软件能力认证
- 有了这个神器,再也不怕shell写得不对了
- echart地图不显示问题
- Windows Phone 7将胜出的五条论据