SpringBoot+swagger连接MinIO实现文件的上传下载和删除
废话不多说,直接上干货!
minio中文文档地址:
http://docs.minio.org.cn/docs/master/java-client-quickstart-guide
maven引入
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
MinIOController.java
RestController
@Api(tags = "minio操作")
@RequestMapping("/minio")
public class MinIOController {
@Autowired
MinIOService minIOService;
@ApiOperation(value = "上传文件")
@PostMapping("/uploadFile")
@ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class)
public String uploadFile(MultipartFile multipartFile, String bucketName) {
return minIOService.uploadFile(multipartFile, bucketName);
}
@ApiOperation(value = "下载文件")
@GetMapping("/downloadFile")
@ApiImplicitParams({
@ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class),
@ApiImplicitParam(name = "filename", value = "文件名", required = true, dataTypeClass = String.class)
})
public void uploadFile(String bucketName, String filename) {
minIOService.downloadFile(bucketName, filename);
}
@ApiOperation(value = "删除文件")
@GetMapping("/deleteFile")
@ApiImplicitParams({
@ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class),
@ApiImplicitParam(name = "filename", value = "文件名", required = true, dataTypeClass = String.class)
})
public boolean deleteFile(String bucketName, String filename) {
return minIOService.deleteFile(bucketName, filename);
}
}
MinIOService
public interface MinIOService {
MinioClient connectMinIO();
String uploadFile(MultipartFile multipartFile, String bucketName);
String uploadFileInputStream(InputStream inputStream, String bucketName, String suffix, String contentType);
void downloadFile(String bucketName, String fileName);
boolean deleteFile(String bucketName, String filename);
}
MinIOServiceImpl
IOUtils使用以下包:
import org.apache.tomcat.util.http.fileupload.IOUtils;
@Service
public class MinIOServiceImpl implements MinIOService {
@Value("${minio.url}")
private String minioUrl;
@Value("${minio.accessKey}")
private String minioAccessKey;
@Value("${minio.secretKey}")
private String minioSecretKey;
/**
* 连接minio
*
* @return minioClient
*/
@Override
public MinioClient connectMinIO() {
MinioClient minioClient = null;
try {
minioClient = new MinioClient(minioUrl, minioAccessKey, minioSecretKey);
} catch (Exception e) {
e.printStackTrace();
}
return minioClient;
}
/**
* 上传文件到minio
*
* @param multipartFile 文件
* @param bucketName 桶名
* @return 文件名
*/
@Override
public String uploadFile(MultipartFile multipartFile, String bucketName) {
MinioClient minioClient = connectMinIO();
String fileName = null;
//查看桶名是否存在
try {
boolean bucketExists = minioClient.bucketExists(bucketName);
if (!bucketExists) { //如果不存在,创建桶名
minioClient.makeBucket(bucketName);
}
String filename = multipartFile.getOriginalFilename();
assert filename != null;
//获取文件后缀
String suffix = filename.substring(filename.lastIndexOf("."));
//创建新的文件名
fileName = UUID.randomUUID() + suffix;
//存储数据到minio
minioClient.putObject(bucketName, fileName, multipartFile.getInputStream(), multipartFile.getSize(), multipartFile.getContentType());
} catch (Exception e) {
e.printStackTrace();
}
return fileName;
}
/**
* 上传文件流到minio
*
* @param inputStream 文件流
* @param bucketName 桶名
* @return 文件名
*/
@Override
public String uploadFileInputStream(InputStream inputStream, String bucketName, String suffix, String contentType) {
MinioClient minioClient = connectMinIO();
String fileName = null;
//查看桶名是否存在
try {
boolean bucketExists = minioClient.bucketExists(bucketName);
if (!bucketExists) { //如果不存在,创建桶名
minioClient.makeBucket(bucketName);
}
//创建新的文件名
fileName = UUID.randomUUID() + suffix;
//存储数据到minio
minioClient.putObject(bucketName, fileName, inputStream, contentType);
} catch (Exception e) {
e.printStackTrace();
}
return fileName;
}
/**
* 下载文件
*
* @param bucketName 桶名
* @param fileName 文件名
*/
@Override
public void downloadFile(String bucketName, String fileName) {
MinioClient minioClient = connectMinIO();
InputStream inputStream;
try {
inputStream = minioClient.getObject(bucketName, fileName);
ToolUtils.response.setContentType("application/octet-stream");
//下载需要设置文件名,负责没有文件后缀
ToolUtils.response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
if (null != inputStream) IOUtils.copy(inputStream, ToolUtils.response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除文件
*
* @param bucketName 桶名
* @param filename 文件名
* @return 状态 成功true、则false
*/
@Override
public boolean deleteFile(String bucketName, String filename) {
MinioClient minioClient = connectMinIO();
boolean result = false;
InputStream inputStream = null;
try {
inputStream = minioClient.getObject(bucketName, filename);
if (null != inputStream) {
inputStream.close();
minioClient.removeObject(bucketName, filename);
result = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != inputStream) {
try {
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
}
ToolUtils工具
方便直接操作 HttpServletRequest、HttpServletResponse、session和cookie
@Component
public class ToolUtils {
public static final int COOKIE_DEFAULT_TIME = 1; //以秒为单位(1s)
public static final int SESSION_DEFAULT_TIME = 1; //以秒为单位(1s)
public static HttpServletRequest request;
public static HttpServletResponse response;
public static HttpSession session;
@Autowired
private HttpServletResponse httpServletResponse;
@Autowired
private HttpServletRequest httpServletRequest;
@Autowired
private HttpSession httpSession;
@PostConstruct
public void beforeInit() {
request = httpServletRequest;
response = httpServletResponse;
session = httpSession;
}
/**
* 添加cookie
*
* @param key 名称
* @param value 值
* @param cookieAge 过期时间
*/
public static void setCookie(String key, String value, int cookieAge) {
if (key == null) {
return;
}
if (value == null) {
value = "";
}
Cookie cookie = new Cookie(key, value);
cookie.setPath("/");
if (cookieAge != 0) {
cookie.setMaxAge(COOKIE_DEFAULT_TIME * cookieAge);
} else {
cookie.setMaxAge(COOKIE_DEFAULT_TIME);
}
response.addCookie(cookie);
try {
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取cookie
*
* @param cookieName 名称
* @return 值
*/
public static String getCookie(String cookieName) {
Cookie[] cookies = request.getCookies();
String result = null;
if (null != cookies && cookies.length > 0) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
result = cookie.getValue();
break;
}
}
}
return result;
}
/**
* 删除cookie
*
* @param cookieName 名称
* @return 结果
*/
public static boolean removeCookie(String cookieName) {
boolean result = false;
if (null != cookieName) {
Cookie cookie = new Cookie(cookieName, null);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setValue("");
response.addCookie(cookie);
result = true;
}
return result;
}
/**
* 设置session
*
* @param key 键
* @param value 值
* @param sessionAge 过期时间
*/
public static void setSession(String key, String value, int sessionAge) {
if (key == null) {
return;
}
if (value == null) {
value = "";
}
session.setAttribute(key, value);
if (sessionAge != 0) {
session.setMaxInactiveInterval(COOKIE_DEFAULT_TIME * sessionAge);
} else {
session.setMaxInactiveInterval(SESSION_DEFAULT_TIME);
}
}
/**
* 获取session
*
* @param sessionName 键
* @return 返回内容
*/
public static String getSession(String sessionName) {
Object attribute = session.getAttribute(sessionName);
return null != attribute ? attribute.toString() : null;
}
/**
* 删除session
*
* @param sessionName 键
*/
public static void removeSession(String sessionName) {
Object attribute = session.getAttribute(sessionName);
if (null != attribute) {
session.removeAttribute(sessionName);
}
}
}
以上代码亲测可用,如有问题欢迎留言;