SpringBoot集成Minio
Zhao_yani 2024-08-03 17:05:03 阅读 92
<code>public class MinIOConfig {
@Autowired
private MinIOConfigProperties minIOConfigProperties;
@Bean
public MinioClient buildMinioClient() {
return MinioClient
.builder()
.credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
.endpoint(minIOConfigProperties.getEndpoint())
.build();
}
}
@Data
@ConfigurationProperties(prefix = "minio")
@Component
public class MinIOConfigProperties implements Serializable {
private String accessKey;
private String secretKey;
private String bucket;
private String endpoint;
private String readPath;
}
public interface MinioFileService {
/**
* 下载文件
* @param pathUrl
* @param response
*/
void downLoadFile(String pathUrl, HttpServletResponse response) ;
/**
* 上传文件到指定tong桶下面的指定目录
* @param bucketName 桶名称
* @param folderPath 目录名称
* @param file 文件
*/
String downLoadFileByPath(String bucketName,String folderPath, MultipartFile file) throws Exception;
/**
* 上传文件
* @param file
* @return
* @throws Exception
*/
String uploadFile(File file) throws Exception;
/**
* 创建临时目录
* @return
*/
File createTempDir();
/**
* 删除文件
* @param pathUrl
*/
void delete(String pathUrl) ;
/**
* 列出所有bucket名称
* @return
* @throws Exception
*/
List<String> listBucketNames() throws Exception;
/**
* 创建bucket
* @param bucketName
* @return
* @throws Exception
*/
boolean makeBucket(String bucketName) throws Exception;
/**
* 删除bucket
* @param bucketName
* @return
* @throws Exception
*/
boolean removeBucket(String bucketName) throws Exception;
/**
* 列出bucket的所有对象名称
* @param bucketName
* @return
* @throws Exception
*/
List<String> listObjectNames(String bucketName) throws Exception;
Iterable<Result<Item>> listObjects(String bucketName) throws Exception;
}
@Slf4j
@Import(MinIOConfig.class)
@Service
public class MinioFileServiceImpl implements MinioFileService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinIOConfigProperties minIOConfigProperties;
private final static String separator = "/";
@Value("${Temporary_file_address}")
private String Temporary_file_address;
/**
* 下载文件
*
* @param pathUrl 文件全路径
* @return 文件流
*/
@Override
public void downLoadFile(String pathUrl, HttpServletResponse response) {
String[] pathItems = pathUrl.split("/");
String originFileName = pathItems[pathItems.length - 1];
String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
int index = key.indexOf(separator);
//String bucket = key.substring(0,index);
String filePath = key.substring(index + 1);
InputStream inputStream = null;
try {
inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
response.setHeader("Content-Disposition", "attachment;filename=" + originFileName);
response.setContentType("application/force-download");code>
response.setCharacterEncoding("UTF-8");
IOUtils.copy(inputStream, response.getOutputStream());
System.out.println("下载成功");
} catch (Exception e) {
log.error("minio down file error. pathUrl:{}", pathUrl);
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public String downLoadFileByPath(String bucketName, String folderPath, MultipartFile file) throws Exception{
String endpoint = minIOConfigProperties.getEndpoint();
// 上传文件到指定文件夹
String objectName = folderPath+"/" + file.getOriginalFilename();
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(bucketName)
.contentType(file.getContentType())
.stream(file.getInputStream(), file.getSize(), -1).build();
minioClient.putObject(objectArgs);
return endpoint + "/" + bucketName + "/" + objectName;
}
// @Override
// public String uploadFile(MultipartFile file) throws Exception {
// String bucketName = minIOConfigProperties.getBucket();
// String endpoint = minIOConfigProperties.getEndpoint();
// InputStream inputStream = file.getInputStream();
// // 检查存储桶是否已经存在
// boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
// if (isExist) {
// System.out.println("Bucket already exists.");
// } else {
// minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
// }
// String originalFilename = file.getOriginalFilename();
// //拼接生成新的UUID形式的文件名
// String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) +
// UUID.randomUUID().toString().replaceAll("-", "")
// + originalFilename.substring(originalFilename.lastIndexOf("."));
//
// PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
// .bucket(bucketName)
// .contentType(file.getContentType())
// .stream(inputStream, file.getSize(), -1).build();
// minioClient.putObject(objectArgs);
// inputStream.close();
// //组装桶中文件的访问url
// String resUrl = endpoint + "/" + bucketName + "/" + objectName;
// return resUrl;
// }
@Override
public String uploadFile(File file) throws Exception {
String bucketName = minIOConfigProperties.getBucket();
String endpoint = minIOConfigProperties.getEndpoint();
try {
// 检查存储桶是否已经存在
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
// 拼接生成新的UUID形式的文件名
String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) +
UUID.randomUUID().toString().replaceAll("-", "") +
file.getName().substring(file.getName().lastIndexOf("."));
// 上传
minioClient.uploadObject(UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(file.getAbsolutePath())
.build());
// 组装桶中文件的访问url
return endpoint + "/" + bucketName + "/" + objectName;
} catch (Exception e) {
log.error("上传文件 {} 失败: {}", file.getName(), e.getMessage());
e.printStackTrace();
throw new ServiceException(1000000500, "上传文件失败:" + e);
} finally {
// 删除临时文件
this.deleteTempFile(file);
}
}
/**
* 在应用启动时
* 创建临时目录
*/
@Override
public File createTempDir() {
String property = System.getProperty("user.home");
// 生成或指定文件存储的目录
File dir = new File(property);
if (!dir.exists()) {
dir.mkdirs();
}
return dir;
}
/**
* 删除临时文件
* @param file file
*/
private void deleteTempFile(File file) {
try {
Files.deleteIfExists(Paths.get(file.getAbsolutePath()));
} catch (IOException e) {
log.error("删除临时文件失败: {}", file.getAbsolutePath(), e);
}
}
/**
* 删除文件
*
* @param pathUrl 文件全路径
*/
@Override
public void delete(String pathUrl) {
String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
int index = key.indexOf(separator);
String bucket = key.substring(0, index);
String filePath = key.substring(index + 1);
// 删除Objects
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
try {
minioClient.removeObject(removeObjectArgs);
} catch (Exception e) {
log.error("minio remove file error. pathUrl:{}", pathUrl);
e.printStackTrace();
}
}
public List<Bucket> listBuckets()
throws Exception {
return minioClient.listBuckets();
}
public boolean bucketExists(String bucketName) throws Exception {
boolean flag = minioClient.bucketExists( BucketExistsArgs.builder().bucket(bucketName).build());
if (flag) {
return true;
}
return false;
}
@Override
public List<String> listBucketNames() throws Exception{
List<Bucket> bucketList = listBuckets();
List<String> bucketListName = new ArrayList<>();
for (Bucket bucket : bucketList) {
bucketListName.add(bucket.name());
}
return bucketListName;
}
@Override
public boolean makeBucket(String bucketName) throws Exception{
boolean flag = this.bucketExists(bucketName);
if (!flag) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
return true;
} else {
return false;
}
}
@Override
public boolean removeBucket(String bucketName) throws Exception{
boolean flag = bucketExists(bucketName);
if (flag) {
Iterable<Result<Item>> myObjects = listObjects(bucketName);
for (Result<Item> result : myObjects) {
Item item = result.get();
// 有对象文件,则删除失败
if (item.size() > 0) {
return false;
}
}
// 删除存储桶,注意,只有存储桶为空时才能删除成功。
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
flag = bucketExists(bucketName);
if (!flag) {
return true;
}
}
return false;
}
@Override
public List<String> listObjectNames(String bucketName) throws Exception{
List<String> listObjectNames = new ArrayList<>();
boolean flag = bucketExists(bucketName);
if (flag) {
Iterable<Result<Item>> myObjects = listObjects(bucketName);
for (Result<Item> result : myObjects) {
Item item = result.get();
listObjectNames.add(item.objectName());
}
}
return listObjectNames;
}
public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
}
return null;
}
}
public class MultipartConfigElement {
@Bean
public javax.servlet.MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/home/temp");
return factory.createMultipartConfig();
}
}
添加依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
配置application.yam文件:
//application.yam文件
minio:
accesskey: xxxxxxxxxxxxxxxxxxxxxxx
secretKey: xxxxxxxxxxxxxxxxxxxxx
endpoint: http://xxxxxxxx:端口号
readPath: http://xxxxxxxx:端口号
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。