1.配置文件
2. 配置实体
@ConfigurationProperties(prefix = "minio.client")
@Data
public class MinioClientProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String defaultBucket;
}
3.配置
@Configuration
@ConditionalOnProperty(prefix = "minio.client", name = "enabled", havingValue = "true")
@EnableConfigurationProperties(MinioClientProperties.class)
public class MinioClientConfiguration {
@Bean
public MinioClient getS3Client(MinioClientProperties s3Config) {
return MinioClient.builder()
.endpoint(s3Config.getEndpoint())
.credentials(s3Config.getAccessKey(), s3Config.getSecretKey())
.build();
}
}
4.工具类
@Slf4j
public final class S3StorageUtil {
private static MinioClient minioClient;
static {
minioClient = SpringBeanUtils.getBean(MinioClient.class);
}
private S3StorageUtil() {
}
/**
* 文件上传
*
* @param file 文件
* @return Boolean
*/
public String upload(MultipartFile file, String bucketName) {
String fileName;
try {
fileName = FileUtil.extName(file.getOriginalFilename());
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)
.stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error( e.getMessage());
return null;
}
return fileName;
}
/**
* 文件上传
*
* @param file 文件
* @return Boolean
*/
public static String upload(String bucketName, String fileName, MultipartFile file) {
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)
.stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error( e.getMessage());
return null;
}
return fileName;
}
/**
* 查看存储bucket是否存在
*
* @return boolean
*/
public static Boolean bucketExists(String bucketName) {
boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
log.error( e.getMessage());
return false;
}
return found;
}
/**
* 创建存储桶
*
* @param bucketName 存储桶名称
*/
@SneakyThrows
public static boolean makeBucket(String bucketName) {
boolean flag = bucketExists(bucketName);
if (!flag) {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(READ_WRITE).build());
return true;
} else {
return false;
}
}
/**
* 删除
*
* @param fileName
* @return
* @throws Exception
*/
public static boolean remove(String bucketName, String fileName) {
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
} catch (Exception e) {
return false;
}
return true;
}
/**
* 文件下载
*
* @param fileName 文件名称
* @param res response
* @return Boolean
*/
public static void download(String bucketName, String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
.object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
while ((len = response.read(buf)) != -1) {
os.write(buf, 0, len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
//设置强制下载不打开
//res.setContentType("application/force-download");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
try (ServletOutputStream stream = res.getOutputStream()) {
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
log.error( e.getMessage());
}
}
}