一,前言
安装教程可看我以前的文章,Linux和Windows安装教程都有。安装好minio后今天学习minio的使用。
二,集成Minio
1,导入依赖,版本可自己选择
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version>
</dependency>
2,application.yml中配置minio信息
minio:endpoint: http://localhost:9000 # minio地址access-key: admin # 账号secret-key: admin123 # 密码bucket-name: my-bucket # 存储桶名称
如果不想用账号密码也可以使用生成的秘钥
3,编写 MinioConfig.class 配置类
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {/*** 扫描配置文件,获取minio的相关配置信息*/private String endpoint;private String accessKey;private String secretKey;private String bucketName;/*** 构建 minioClient 客户端*/@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}
4,编写 MinioUtils.class 工具类
@Component
@Slf4j
public class MinioUtils {/*** 构造器注入 minioClient、minioConfig*/private final MinioClient minioClient;private final MinioConfig minioConfig;public MinioUtils(MinioClient minioClient,MinioConfig minioConfig) {this.minioClient = minioClient;this.minioConfig = minioConfig;}/*** 上传文件到minio** @param file 文件* @return 文件存储的路径*/public String uploadFile(MultipartFile file) {String originalFilename = file.getOriginalFilename();if (StringUtils.isBlank(originalFilename)) {throw new RuntimeException();}// 重新命名文件,文件名为 uuid 生成String fileName = UuidUtils.getUuid() + originalFilename.substring(originalFilename.lastIndexOf("."));// 设置存储目录,设置 年-月和日两级目录String objectName = DateUtils.format(new Date(), "yyyy-MM/dd") + "/" + fileName;try {PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(objectName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();// 文件名称相同会覆盖minioClient.putObject(objectArgs);} catch (Exception e) {// 异常处理return null;}// 拼接minio的端点和存储桶的名称return getPrefix() + objectName;}/*** 根据文件名称删除文件** @param file 文件路径*/public void deleteFile(String file) {// 获取文件的名称String fileName = removeMinioEndpoint(file);try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build());} catch (Exception e) {// 异常处理e.printStackTrace();}}/*** 下载文件** @param file 文件路径*/public void downloadFile(String file, HttpServletResponse response) {// 获取文件的名称String fileName = removeMinioEndpoint(file);try {InputStream fileIo = minioClient.getObject(GetObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build());// 设置响应类型response.setContentType("application/octet-stream");// 设置附件名称response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");IOUtils.copy(fileIo, response.getOutputStream());response.flushBuffer();} catch (Exception e) {// 异常处理e.printStackTrace();}}/*** 移除文件路径的前缀,获取文件的名称** @param file 文件路径*/public String removeMinioEndpoint(String file) {return file.substring(getPrefix().length()-1);}/*** 获取文件前缀*/public String getPrefix() {return minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/";}}
5,编写测试接口
import static com.cms.pojo.CommonResult.success;@RestController
@RequestMapping("/system/file")
public class FileController {@ResourceMinioUtils minioUtil;/*** 上传文件* @param file 文件*/@PostMapping("/upload")public CommonResult<String> uploadFile(@RequestParam("file") MultipartFile file) {String objectName = minioUtil.uploadFile(file);return success(objectName);}/*** 删除文件* @param file 文件*/@DeleteMapping("/delete")public CommonResult<String> deleteFile(String file) {minioUtil.deleteFile(file);return success("success");}/*** 下载文件* @param file 文件*/@GetMapping("/download")public void downloadFile(String file, HttpServletResponse response) {minioUtil.downloadFile(file,response);}
}
6,上传文件
直接访问地址可查看图片
注意存储权限要改为public
7,下载文件,参数为上传文件返回的地址
8,删除文件
文件已删除
大功告成!!!