Java整合minio实现文件预览上传和下载
minio 在windows系统安装和使用
最近在使用minio做图片存储,在使用过程中遇到一些问题,总结记录下来。这里不对minio做过多介绍,具体资料自行查找.
1、官网地址 https://min.io/
2、github地址 https://github.com/minio/minio
3、windows 服务端下载地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe
4、安装启动
启动一个cmd窗口,进入minio.exe所在文件夹,输入如下命令 注:miniodata是需自己创建图片上传之后的存储目录
1 | .\minio.exe server H:\DevelopTools\miniodata |
运行成功之后,会看到下面的界面
使用命令行界面给出的地址都可以登录,账号密码都在地址下面。登录后如下图所示。
在后台管理界面上你可以创建你的Bucket(桶),可以理解为一个文件夹用来存放图片。桶创建成功之后就可以上传图片了
springboot整合minio实现文件预览上传和下载
第一步:引入依赖
1 2 3 4 5 | <!--存储文件依赖--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version> 7.1 . 0 </version><br> </dependency> |
第二步:配置参数类
1 2 3 4 5 6 7 8 9 10 11 12 | /** * minio相关配置 也可以配置在yml文件 */ @Component public class ParamConfig { public static String endpoint = "http://127.0.0.1:9000" ; public static String accessKey = "minioadmin" ; public static String secretKey = "minioadmin" ; public static String bucketName = "uavtest" ; } |
第三步:添加MinIoUtil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | import cn.hutool.core.date.DateUtil; import io.minio.MinioClient; import io.minio.PutObjectOptions; import io.minio.messages.Bucket; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import java.io.InputStream; import java.util.Date; import java.util.List; /** * Minio工具类 */ @Slf4j @Component public class MinIoUtil { public static MinioClient minioClient; public static ParamConfig paramConfig; /** * 初始化minio配置 */ @PostConstruct public void init() { try { log.info( "Minio Initialize........................" ); minioClient = MinioClient.builder().endpoint(paramConfig.endpoint).credentials(paramConfig.accessKey, paramConfig.secretKey).build(); createBucket(paramConfig.bucketName); log.info( "Minio Initialize........................successful" ); } catch (Exception e) { e.printStackTrace(); log.error( "初始化minio配置异常: 【{}】" , e.fillInStackTrace()); } } /** * 判断bucket是否存在 */ @SneakyThrows (Exception. class ) public static boolean bucketExists(String bucketName) { return minioClient.bucketExists(bucketName); } /** * 创建bucket */ @SneakyThrows (Exception. class ) public static void createBucket(String bucketName) { boolean isExist = minioClient.bucketExists(bucketName); if (!isExist) { minioClient.makeBucket(bucketName); } } /** * 获取全部bucket */ @SneakyThrows (Exception. class ) public static List<Bucket> getAllBuckets() { return minioClient.listBuckets(); } /** * 文件上传 * * @param bucketName: 桶名 * @param fileName: 文件名 * @param filePath: 文件路径 */ @SneakyThrows (Exception. class ) public static void upload(String bucketName, String fileName, String filePath) { minioClient.putObject(bucketName, fileName, filePath, null ); } /** * 上传文件 * 返回可以直接预览文件的URL */ public static String uploadFile(MultipartFile file) { try { //如果存储桶不存在则创建 if (!bucketExists(ParamConfig.bucketName)) { createBucket(ParamConfig.bucketName); } PutObjectOptions putObjectOptions = new PutObjectOptions(file.getInputStream().available(), - 1 ); putObjectOptions.setContentType(file.getContentType()); String originalFilename = file.getOriginalFilename(); //得到文件流 InputStream inputStream = file.getInputStream(); //保证文件不重名(并且没有特殊字符) String fileName = ParamConfig.bucketName + DateUtil.format( new Date(), "_yyyyMMddHHmmss" ) + originalFilename; minioClient.putObject(ParamConfig.bucketName, fileName, inputStream, putObjectOptions); return getPreviewFileUrl(ParamConfig.bucketName, fileName); } catch (Exception e) { e.printStackTrace(); return "" ; } } /** * 文件上传 * 返回下载文件url地址 和下面upload方法仅传参不同 * bucketName 也可以直接从ParamConfig对象中获取 */ @SneakyThrows (Exception. class ) public static String upload(String bucketName, String fileName, InputStream stream) { minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), - 1 )); return getPreviewFileUrl(bucketName, fileName); } /** * 文件上传 * 返回下载文件url地址 和上面upload方法仅传参不同 */ @SneakyThrows (Exception. class ) public static String upload(String bucketName, MultipartFile file) { final InputStream is = file.getInputStream(); final String fileName = file.getOriginalFilename(); minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), - 1 )); is.close(); return getPreviewFileUrl(bucketName, fileName); } /** * 删除文件 * * @param bucketName: 桶名 * @param fileName: 文件名 */ @SneakyThrows (Exception. class ) public static void deleteFile(String bucketName, String fileName) { minioClient.removeObject(bucketName, fileName); } /** * 下载文件 */ // @SneakyThrows(Exception.class) // public static void download(String bucketName, String fileName, HttpServletResponse response) { // // 获取对象的元数据 // final ObjectStat stat = minioClient.statObject(bucketName, fileName); // response.setContentType(stat.contentType()); // response.setCharacterEncoding("UTF-8"); // response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); // InputStream is = minioClient.getObject(bucketName, fileName); // IOUtils.copy(is, response.getOutputStream()); // is.close(); // } /** * 获取minio文件的下载或者预览地址 * 取决于调用本方法的方法中的PutObjectOptions对象有没有设置contentType * * @param bucketName: 桶名 * @param fileName: 文件名 */ @SneakyThrows (Exception. class ) public static String getPreviewFileUrl(String bucketName, String fileName) { return minioClient.presignedGetObject(bucketName, fileName); } } |
第四步:接口中引用
1 2 3 4 5 6 7 | @ResponseBody @PostMapping ( "/tFlightFileUpload" ) @ApiOperation (value = "文件上传管理-添加minio" ) public Response add( @RequestParam ( "file" ) MultipartFile file) throws IOException { String url = MinIoUtil.uploadFile(file); return Response.success(url); } |
注:仔细看工具类中的方法上的注释 可以返回预览文件和下载文件的URL
now ,fight for future
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了