1 MinIO

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

2 MinIO安装和启动

由于MinIO是一个单独的服务器,需要单独部署,有关MinIO的使用之前已经总结,有需要可以查看。

3 pom.xml(maven依赖文件)

     <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.0.2</version></dependency>

4 applicatin.properties(配置文件)

# 设置单个文件大小
spring.servlet.multipart.max-file-size= 50MB
#minio文件服务器配置
minio.address=http://localhost:9000
minio.accessKey=admin
minio.secretKey=12345678
minio.bucketName=myfile

5 MinIOService

minio有关的操作(判断存储桶是否存在,创建存储桶,上传文件,下载文件,删除文件)

package com.service;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Date;@Data
@Component
public class MinIOService {@Value("${minio.address}")private String address;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucketName}")private String bucketName;public MinioClient getMinioClient() {try {return new MinioClient(address, accessKey, secretKey);} catch (Exception e) {e.printStackTrace();return null;}}/*** 检查存储桶是否存在** @param bucketName 存储桶名称* @return*/public boolean bucketExists(MinioClient minioClient, String bucketName) {boolean flag = false;try {flag = minioClient.bucketExists(bucketName);if (flag) {return true;}} catch (Exception e) {e.printStackTrace();return false;}return false;}/*** 创建存储桶** @param bucketName 存储桶名称*/public boolean makeBucket(MinioClient minioClient, String bucketName) {try {boolean flag = bucketExists(minioClient, bucketName);//存储桶不存在则创建存储桶if (!flag) {minioClient.makeBucket(bucketName);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 上传文件** @param file 上传文件* @return 成功则返回文件名,失败返回空*/public String uploadFile(MinioClient minioClient, MultipartFile file) {//创建存储桶boolean createFlag = makeBucket(minioClient, bucketName);//创建存储桶失败if (createFlag == false) {return "";}try {PutObjectOptions putObjectOptions = new PutObjectOptions(file.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);putObjectOptions.setContentType(file.getContentType());String originalFilename = file.getOriginalFilename();int pointIndex = originalFilename.lastIndexOf(".");//得到文件流InputStream inputStream = file.getInputStream();//保证文件不重名(并且没有特殊字符)String fileName = bucketName+ DateUtil.format(new Date(), "_yyyyMMddHHmmss") + (pointIndex > -1 ? originalFilename.substring(pointIndex) : "");minioClient.putObject(bucketName, fileName, inputStream, putObjectOptions);return fileName;} catch (Exception e) {e.printStackTrace();return "";}}/*** 下载文件** @param originalName 文件路径*/public InputStream downloadFile(MinioClient minioClient, String originalName, HttpServletResponse response) {try {InputStream file = minioClient.getObject(bucketName, originalName);String filename = new String(originalName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);if (StrUtil.isNotBlank(originalName)) {filename = originalName;}response.setHeader("Content-Disposition", "attachment;filename=" + filename);ServletOutputStream servletOutputStream = response.getOutputStream();int len;byte[] buffer = new byte[1024];while ((len = file.read(buffer)) > 0) {servletOutputStream.write(buffer, 0, len);}servletOutputStream.flush();file.close();servletOutputStream.close();return file;} catch (Exception e) {e.printStackTrace();return null;}}/*** 删除文件** @param fileName 文件路径* @return*/public boolean deleteFile(MinioClient minioClient, String fileName) {try {minioClient.removeObject(bucketName, fileName);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 得到指定文件的InputStream** @param originalName 文件路径* @return*/public InputStream getObject(MinioClient minioClient, String originalName) {try {return minioClient.getObject(bucketName, originalName);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据文件路径得到预览文件绝对地址** @param minioClient* @param fileName    文件路径* @return*/public String getPreviewFileUrl(MinioClient minioClient, String fileName) {try {return minioClient.presignedGetObject(bucketName,fileName);}catch (Exception e){e.printStackTrace();return "";}}
}

6 FileController

文件上传、文件下载、文件删除接口。

package com.controller;import com.service.MinIOService;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;@RequestMapping("/file")
@RestController
public class FileController {@Autowiredprivate MinIOService minIOService;/*** 上传文件** @param file 文件* @return*/@PostMapping("/uploadFile")public String uploadFile(@RequestBody MultipartFile file) {MinioClient minioClient = minIOService.getMinioClient();if (minioClient == null) {return "连接MinIO服务器失败";}return minIOService.uploadFile(minioClient, file);}/*** 下载文件** @param response 返回请求* @param fileName 文件路径* @return*/@GetMapping("/downloadFile")public String downloadFile(HttpServletResponse response,@RequestParam String fileName) {MinioClient minioClient = minIOService.getMinioClient();if (minioClient == null) {return "连接MinIO服务器失败";}return minIOService.downloadFile(minioClient, fileName, response) != null ? "下载成功" : "下载失败";}/*** 删除文件** @param fileName 文件路径* @return*/@DeleteMapping("/deleteFile/{fileName}")public String deleteFile(@PathVariable("fileName") String fileName) {MinioClient minioClient = minIOService.getMinioClient();if (minioClient == null) {return "连接MinIO服务器失败";}boolean flag = minIOService.deleteFile(minioClient, fileName);return flag == true ? "删除成功" : "删除失败";}
}

7 调试结果

7.1 文件上传

7.2 文件下载

7.3 文件删除

注:

文件删除之后,如果该文件夹下没有文件存在,MinIO会自动删除该空文件夹及上级空文件夹。

Spring Boot配置MinIO(实现文件上传、下载、删除)相关推荐

  1. spring boot基础教程之文件上传下载

    一文件上传 文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个文件上传表单页面; (4)编写controller; ( ...

  2. Spring Boot 2.X 实现文件上传(三)

    使用 SpringBoot 项目完成单个.多个文件的上传处理,并将上传的文件保存到指定目录下. 代码演示案例 所有的 HTML 页面文件 index.html <!DOCTYPE html> ...

  3. Spring Boot 利用WebUploader进行文件上传

    Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...

  4. 【Java编程系列】Minio实现文件上传下载

    热门系列: [Java编程系列]Amazon S3实现文件上传下载 目录 热门系列: 1.前言 2.Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Mi ...

  5. SpringBoot中使用yml配置文件以及配置类实现文件上传下载路径的修改

    场景 SpringBoot+thymeleaf实现文件下载或者实现文件上传需要配置文件上传路径的地方, 不要写为固定路径,在配置文件中指定文件路径,代码中直接引用. 避免以后文件路径修改后需要修改业务 ...

  6. minio实现文件上传下载和删除功能

    前言 之前用到文件上传功能,在这里做个学习记录.使用minio实现,后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较(oss根据流量收费).minio的中文文档:https:// ...

  7. minio操作,文件上传下载

    minio操作工具类(其中,ip,端口,账号,密码在配置文件中配置) @Api(value = "minio操作") @Component public class UploadF ...

  8. Struts2 文件上传,下载,删除

    本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...

  9. springboot---fastDFS 简单文件上传/下载/删除

    本来想简单的记录一下上传/下载,后来看着看着,发现这块的知识点太多.就记录下简单的操作,后面在补充 这里采用fastdfs分布式文件系统的形式来进行操作的(关于fastdfs的知识点有很多,这里就不赘 ...

  10. 基于Django的文件上传下载删除管理器

    这是一个基于Django的文件下载,上传,删除的任务管理器 先看看效果展示 1.运行完Django后,直接输入网址http://127.0.0.1:8000 就可以直接进去该网站 2.这是一个主图 上 ...

最新文章

  1. 国行版HomePod售价2799元,本周五发售
  2. Ember.js系列文章
  3. python tkinter button颜色变不了_更改函数中Tkinter按钮的颜色
  4. go gin框架:Any响应任何请求类型
  5. iview选择月份 月初月末 时间戳格式
  6. Java基础学习总结(54)——JSON和Map转换的工具类
  7. Windows下编译sqlite3
  8. C/C++变量在内存中的分布
  9. 水系图一般在哪里找得到_虹吸雨水排水系统相较于传统重力排水有哪些优点?...
  10. 【白盒测试技术之-junit】
  11. 平安普惠系统上线申请表模板
  12. 网络安全-Web端安全协议
  13. JSONP 跨域原理
  14. 世界标准时间(UTC) 常识
  15. 树莓派运行yolo fastest启用bf16加速
  16. 2路继电器控制直流电机正反转问题
  17. L1-084 拯救外星人 C语言
  18. 关于vue小插件:ly-tab的解释
  19. 宁夏最新建筑八大员(资料员)真题题库及答案解析
  20. 爆火上热搜!抖音「变身漫画」特效是如何实现的?

热门文章

  1. [转载] 菜鸟举例理解字节流和字符流区别
  2. [转载] Java中变量与常量
  3. node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第1部分)| Node.js
  4. java scanner_Java Scanner radix()方法与示例
  5. 单位矩阵的逆| 使用Python的线性代数
  6. 量子物理 詹班 计算机,(电气系计算机系詹班)量子物理作业答案
  7. 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...
  8. iis php mysql 集成_如何在IIS上集成php(iis+mysql+php+zend)
  9. mysql+url的配置参数详解_MySql链接url参数详解
  10. 面试必备:Spring 面试 63 问!