SpringBoot之Minio上传下载文件

1.Docker容器安装Minio

  • 拉取docker镜像
docker pull minio/minio
  • 设置minio文件路径
mkdir ~/minio
cd ~/minio
mkdir data
mkdir config
  • 启动minio服务(注意,这里要单独设置console的端口,不然会报错,且无法访问
docker run --name minio \
-p 9000:9000 \
-p 9999:9999 \
-d --restart=always \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server /data \
--console-address '0.0.0.0:9999'
  • 设置系统时间与网络时间同步
date // 查看系统时间
hwclock // 查看硬件时间
yum -y install ntp ntpdate  //安装ntpdate工具
ntpdate cn.pool.ntp.org   //设置系统时间与网络时间同步
hwclock --systohc   //将系统时间写入硬件时间
  • 登录客户端(浏览器)(注意—>此处的端口,是你设置的console的端口:9999,用户名:minio  密码:minio123)

SpringBoot之Minio上传下载文件_第1张图片

 

2.SpringBoot中使用Minio上传文件 

  • 添加maven依赖
        
        
            io.minio
            minio
            7.0.1
        
  • 编辑配置文件 application.yml
server:
  port: 80
spring:
  application:
    name: book-minio
<--上传文件大小设置-->
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB
minio:
  accesskey: minio
  endpoint: http://192.168.126.138:9000
  secretKey: minio123456
  bucketName: song
  • 连接 MinIO 配置
@Data
@ConfigurationProperties(prefix = "minio")
public class MinioPro {
    /**
     * 端点
     */
    private String endpoint;
    /**
     * 用户名
     */
    private String accessKey;
    /**
     * 密码
     */
    private String secretKey;

    /**
     * 桶名称
     */
    private String bucketName;
}
  • 创建 MinioClient
@Configuration
@EnableConfigurationProperties(MinioPro.class)
public class MinioConfiguration {
    @Resource
    private MinioPro minioPro;
        /**
         * 初始化 MinIO 客户端
         */
        @Bean
        public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
            return new MinioClient(minioPro.getEndpoint(), minioPro.getAccessKey(), minioPro.getSecretKey());
        }
}
  • 创建 MinioController
@RestController
@RequestMapping("/minio")
@Validated
@Slf4j
public class FileUploadController {
    @Resource
    private MinioClient minioClient;

    @Autowired
    private MinioPro minio;

    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
    public String uploadFile(@RequestParam("file") MultipartFile file){
        String bucketName = minio.getBucketName();
        String objectName;
        String objectUrl = null;
        try {
            boolean bucketExists = minioClient.bucketExists(bucketName);
            if (!bucketExists) {
                minioClient.makeBucket(bucketName);
            }
            // 设置上传文件名
            String filename = file.getOriginalFilename();
            objectName = System.currentTimeMillis() + "_" + filename;
            // 上传配置
            PutObjectOptions options = new PutObjectOptions(file.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
            options.setContentType(file.getContentType());
            minioClient.putObject(bucketName, objectName, file.getInputStream(), options);
            objectUrl = minioClient.getObjectUrl(minio.getBucketName(), objectName);
        } catch (Exception e) {
            log.error("上传文件失败", e.getMessage());
            return "上传文件失败";
        }
        return objectUrl;
    }
}

3.使用postman或者apiPost测试

SpringBoot之Minio上传下载文件_第2张图片

 SpringBoot之Minio上传下载文件_第3张图片

注意:上传可能报错 ,原因是硬件时间与系统时间不一致造成,Minio的设时间不能相差太多,不然无法上传,解决方式: 按照上述 设置系统时间与网络时间同步 重新设置一下

你可能感兴趣的