Minio文件管理

该博客介绍了如何配置Minio服务器,并通过Java代码实现文件的上传和下载功能。首先,展示了Minio配置信息的枚举类,然后详细说明了文件上传接口的实现,包括检查存储桶、创建存储桶、上传文件以及生成临时和永久下载链接。接着,提供了文件下载接口的实现,包括设置响应头、获取文件内容并输出。最后,列出了所需的Minio和Okhttp依赖。
摘要由CSDN通过智能技术生成

1、配置文件服务器

   /**
     * 作者:kt
     * 时间:2022/11/11 11:28
     * 描述:minio配置信息
     */
    @AllArgsConstructor
    @Getter
    public enum MinioEnum {
        ADDRESS("***********","minio地址"),
        BUCKET_NAME("****","存储桶名称"),
        ACCESS_KEY("****","访问的key"),
        SECRET_KEY("*******","访问的秘钥"),
        AVATAR("****","文件在桶中的存放路径"),
        ;
        final String value;
        final String remark;
    }

2 编写接口


@Api(tags = "minio文件管理")
    @ApiOperation(value = "文件上传")
    @PostMapping("/upLoadAvatar")public ResponseObj upLoadAvatar(MultipartFile file) {
        try{

            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(MinioEnum.ADDRESS.getValue())
                            .credentials(MinioEnum.ACCESS_KEY.getValue(), MinioEnum.SECRET_KEY.getValue())
                            .build();

            //判断存储桶是否已经存在,不存在的话创建
            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(MinioEnum.BUCKET_NAME.getValue()).build());

            //如果存储桶不存在则要创建
            if (!exists){
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(MinioEnum.BUCKET_NAME.getValue()).build());
            }
            //文件名字拼接
            String fileName =file.getOriginalFilename();
            String oobName =new SimpleDateFormat("yyyy-MM-dd-").format(new Date())
                    + UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));

            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(MinioEnum.BUCKET_NAME.getValue())
                    .object(MinioEnum.AVATAR.getValue()+"/"+oobName)
                    .stream(file.getInputStream(),file.getSize(),-1)
                    .contentType(file.getContentType())
                    .build());

            //服务端需要返回一段json串给客户端,application/Json 非必须有默认的
            Map<String, String> reqParams = new HashMap<>();
            reqParams.put("response-content-type", "application/json");

            //得到临时下载地址
            String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket(MinioEnum.BUCKET_NAME
                            .getValue()).object(MinioEnum.AVATAR.getValue()+"/"+ file.getOriginalFilename())
                    .method(Method.GET)
                    .extraQueryParams(reqParams) /*非必须有默认的*/
                    .build());

            //自己组装永久下载地址-需要设置桶的权限为ReadAndWrite或只读
            String url2=MinioEnum.ADDRESS.getValue()+"/"+MinioEnum.BUCKET_NAME.getValue()+"/"+MinioEnum.AVATAR.getValue()+"/"+oobName;

            return ResponseObj.success(oobName);
        }catch (Exception e){
            e.printStackTrace();
            return ResponseObj.success("异常了");
        }

    }

    /**
     * 作者: kt
     * 时间: 2022/11/11 11:18
     * 描述: 文件下载、预览
     * https://docs.min.io/minio/baremetal/sdk/java/minio-java.html
     */
    @GetMapping("/downLoadAvatar")
    @ApiOperation(value = "文件下载")
    public void upLoadAvatar2(String name,HttpServletResponse response) throws IOException {
        InputStream in=null;
        try{

            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(MinioEnum.ADDRESS.getValue())
                            .credentials(MinioEnum.ACCESS_KEY.getValue(), MinioEnum.SECRET_KEY.getValue())
                            .build();

            StatObjectResponse statObject = minioClient.statObject(StatObjectArgs.builder()
                    .bucket(MinioEnum.BUCKET_NAME.getValue())
                    .object(MinioEnum.AVATAR.getValue()+"/"+name)
                    .build());

            /**
             * 描述: content-type 指示响应内容的格式
             * content-disposition 指示如何处理响应内容。
             * 一般有两种方式:
             * inline:直接在页面显示-预览
             * attachment:以附件形式下载-下载
             */
            response.setContentType(statObject.contentType());
//            response.setContentType("image/png");
            response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(name, "UTF-8"));
//            response.setHeader("Content-Disposition", "attachment; filename=" + name);

            in = minioClient.getObject(GetObjectArgs.builder()
                    .bucket(MinioEnum.BUCKET_NAME.getValue())
                    .object(MinioEnum.AVATAR.getValue()+"/"+name)
                    .build());

            IOUtils.copy(in,response.getOutputStream());

        }catch (Exception e){
            e.printStackTrace();
        }
        finally {
            if (in != null) {
                in.close();
            }
        }

    }
}



3、导入POM

        <!-- https://mvnrepository.com/artifact/io.minio/minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.3</version>
        </dependency>

        <!-- 官方 miniodemo需要的依赖,没有的话启动会说找不到okhttp啥的;-->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.2</version>
        </dependency>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值