前言
记录一下,下面概述附链接,介绍的非常详细;以及项目中使用的工具类代码。
概述
使用代码
/**
* minio工具类
* @Author zsl
* @Date 2022/3/8 18:14
* @Email 249269610@qq.com
*/
@Slf4j
@Component
public class MinioUtil {
@Value("${minio.bucketName}")
String bucketName;
@Autowired
MinioClient minioClient;
/**
* 获取 minio对象
*
* @param filename 文件名
* @return 对象,若不存在则为null
*/
public ObjectStat getObject(String filename) {
return getObject(bucketName, filename);
}
/**
* 获取 minio对象
*
* @param bucketName 桶信息
* @param filename 文件名
* @return 对象,若不存在则为null
*/
public ObjectStat getObject(String bucketName, String filename) {
try {
return minioClient.statObject(bucketName, filename);
} catch (Exception e) {
// e.printStackTrace();
log.info("对象 {} 不存在桶 {}", filename, bucketName);
}
return null;
}
/**
* 获取 minio流
*
* @param filename
* @return
*/
public InputStream getInputStream(String filename) {
return getInputStream(bucketName, filename);
}
/**
* 获取 minio流
*
* @param bucketName 桶名称
* @param filename 文件名
* @return 文件流
*/
@SneakyThrows
public InputStream getInputStream(String bucketName, String filename) {
return minioClient.getObject(bucketName, filename);
}
/**
* 获取全部 bucket
*
* @return all bucket
*/
@SneakyThrows
public List<Bucket> getAllBucket() {
return minioClient.listBuckets();
}
/**
* 判断 bucket是否存在
*
* @param bucketName 桶名称
* @return true 存在
*/
@SneakyThrows
public boolean bucketExists(String bucketName) {
return minioClient.bucketExists(bucketName);
}
/**
* 创建 bucket
*
* @param bucketName 桶名称
*/
@SneakyThrows
public void createBucket(String bucketName) {
if (!bucketExists(bucketName)) {
minioClient.makeBucket(bucketName);
}
}
/**
* 获取 minio下载地址
*
* @param filename 文件名
*/
public String getUrl(String filename) {
return getUrl(bucketName, filename);
}
/**
* 获取 minio下载地址
*
* @param bucketName 桶名
* @param filename 文件名
*/
@SneakyThrows
public String getUrl(String bucketName, String filename) {
return minioClient.presignedGetObject(bucketName, filename);
}
/**
* 文件上传
*
* @param file 文件
* @return 文件url
*/
public String upload(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
upload(bucketName, file);
log.info("上传结束 {}", file.getOriginalFilename());
return getUrl(originalFilename);
}
/**
* 文件上传
*
* @param bucketName 桶名称
* @param file 文件
* @return 文件url
*/
public String upload(String bucketName, MultipartFile file) {
InputStream is = null;
try {
is = file.getInputStream();
String filename = file.getOriginalFilename();
upload(bucketName, filename, is);
return getUrl(bucketName, filename);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtil.close(is);
}
return null;
}
/**
* 文件上传
*
* @param filename 文件名
* @param is 流
* @return 文件url
*/
public String upload(String filename, InputStream is) {
return upload(bucketName, filename, is);
}
/**
* 文件上传
*
* @param bucketName 桶名称
* @param filename 文件名
* @param is 流
* @return 文件url
*/
@SneakyThrows
public String upload(String bucketName, String filename, InputStream is) {
minioClient.putObject(bucketName, filename, is, new PutObjectOptions(is.available(), -1));
return getUrl(filename);
}
/**
* 文件下载
*
* @param filename 文件名称
* @param request 请求
* @param response 响应
*/
public void download(String filename, HttpServletRequest request, HttpServletResponse response) {
download(bucketName, filename, request, response);
}
/**
* 文件下载
*
* @param bucketName 桶名称
* @param filename 文件名称
* @param request 请求
* @param response 响应
*/
public void download(String bucketName, String filename, HttpServletRequest request, HttpServletResponse response) {
// 获取 Mine类型
ServletContext servletContext = request.getServletContext();
String mimeType = servletContext.getMimeType(filename);
response.setContentType(mimeType);
//告诉客户端收到的数据是用于下载使用(通过响应头)
try {
if (request.getHeader("User-Agent").contains("Firefox")) {
//火狐浏览器 Base64
response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode(filename.getBytes("UTF-8")) + "?=");
} else {
//谷歌 IE URLEncoder
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
log.debug("设置响应头文件名转码失败!");
return ;
}
// 获取流
InputStream is = null;
ServletOutputStream os = null;
byte[] bytes = new byte[8 * 1024];
int len;
try {
is = minioClient.getObject(bucketName, filename);
os = response.getOutputStream();
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtil.close(is, os);
}
}
/**
* 删除 minio文件
*
* @param filename 文件名
*/
public void del(String filename) {
del(bucketName, filename);
}
/**
* 删除 minio文件
*
* @param bucketName 桶名称
* @param filename 文件名
*/
@SneakyThrows
public void del(String bucketName, String filename) {
minioClient.removeObject(bucketName, filename);
}
/**
* 设置桶策略
*
* @param bucketName 桶名称
* @param policy 策略
*/
@SneakyThrows
public void setBucketPolicy(String bucketName, String policy) {
minioClient.setBucketPolicy(bucketName, policy);
}
}