springboot+minio快速入门

268 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天

1、导入依赖

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.1</version>
</dependency>

2、添加配置项,并初始化配置

基础参数配置

minio:
  url: http://localhost:9000
  user: admin
  password: admin123
  bucketName: test

新建配置文件(MinioProperties)

@Slf4j
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
​
    /**
     * 服务地址
     */
    private String url;
    /**
     * 用户名
     */
    private String user;
    /**
     * 密码
     */
    private String password;
    /**
     * 存储桶名称
     */
    private String bucketName;
​
}

新建MinioConfig

@Slf4j
@Configuration
@RequiredArgsConstructor
public class MinioConfig {
​
    final MinioProperties minioProperties;
​
    /**
     * 注入minio 客户端
     *
     * @return MinioClient
     */
    @Bean
    public MinioClient minioClient() {
        log.info("Init MinioClient Success");
        return MinioClient.
                builder().
                endpoint(minioProperties.getUrl()).
                credentials(minioProperties.getUser(), minioProperties.getPassword()).
                build();
    }
}

3、新建服务层,基本上传|下载|删除

新建MinioService

public interface MinioService {
​
    /**
     * 文件上传
     *
     * @param file 文件对象
     * @return 上传结果
     */
    String upload(MultipartFile file);
​
    /**
     * 文件上传
     *
     * @param files 文件对象
     * @return 上传结果(多个用逗号分割)
     */
    String upload(MultipartFile[] files);
​
    /**
     * 下载
     *
     * @param fileName 文件名称
     * @return InputStream输入流
     */
    InputStream download(String fileName);
​
    /**
     * 删除文件
     *
     * @param fileNames 文件名称
     */
    void delete(List<String> fileNames);
}

新建MinioServiceImpl实现MinioService

@Service
@RequiredArgsConstructor
public class MinioServiceImpl implements MinioService {
​
    final MinioClient minioClient;
    final MinioProperties minioProperties;
​
    /**
     * /**
     * 文件上传
     *
     * @param file 文件对象
     * @return 上传结果
     */
    @Override
    @SneakyThrows
    public String upload(MultipartFile file) {
        // 生成文件路径
        StringJoiner fileName = new StringJoiner(File.separator);
        fileName.add(String.valueOf(DateUtil.thisYear()));
        fileName.add(String.valueOf(DateUtil.thisMonthEnum().getValueBaseOne()));
        fileName.add(String.valueOf(DateUtil.thisDayOfMonth()));
        fileName.add(IdUtil.fastSimpleUUID() + "." + FileNameUtil.getSuffix(file.getOriginalFilename()));
        // 上传
        minioClient.putObject(PutObjectArgs.builder()
                .object(fileName.toString())
                .bucket(minioProperties.getBucketName())
                .contentType(file.getContentType())
                .stream(file.getInputStream(), file.getSize(), -1)
                .build());
        return fileName.toString();
    }
​
    /**
     * 文件上传
     *
     * @param files 文件对象
     * @return 上传结果(多个用逗号分割)
     */
    @Override
    public String upload(MultipartFile[] files) {
        StringJoiner result = new StringJoiner(",");
        for (MultipartFile file : files) {
            result.add(this.upload(file));
        }
        return result.toString();
    }
​
    /**
     * 下载
     *
     * @param fileName 文件名称
     * @return InputStream输入流
     */
    @Override
    @SneakyThrows
    public InputStream download(String fileName) {
        return minioClient.getObject(GetObjectArgs.builder().bucket(minioProperties.getBucketName()).object(fileName).build());
    }
​
    /**
     * 删除文件
     *
     * @param fileNames 文件名称
     */
    @Override
    public void delete(List<String> fileNames) {
        minioClient.removeObjects(RemoveObjectsArgs
                .builder()
                .bucket(minioProperties.getBucketName())
                .objects(fileNames.stream().map(DeleteObject::new).collect(Collectors.toList()))
                .build());
    }
}