使用新版本Minio的SDK实现文件的上传和下载

一、minio配置信息,为了方便,这里不写在配置文件直接用枚举

import lombok.AllArgsConstructor;
import lombok.Getter;

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

依赖:

        <!-- 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>

二、上传

/**
     * 作者: 唐婉
     * 时间: 2022/8/15 11:18
     * 描述: 头像上传
     * 官方文档:https://docs.min.io/minio/baremetal/sdk/java/minio-java.html
     */
    @PostMapping("/upLoadAvatar")public String 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());
            }

            //System.out.println(file.getName());
            //System.out.println(file.getOriginalFilename());
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(MinioEnum.BUCKET_NAME.getValue())
                    .object(MinioEnum.AVATAR.getValue()+"/"+file.getOriginalFilename())
                    .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()+"/"+file.getOriginalFilename(); return "上传成功了"; }catch (Exception e){ e.printStackTrace(); return "异常了"; } }

三、下载、预览

下载的话可以直接访问上面的地址进行下载

/**
     * 作者: 唐婉
     * 时间: 2022/8/15 11:18
     * 描述: 文件下载、预览
     * https://docs.min.io/minio/baremetal/sdk/java/minio-java.html
     */
    @GetMapping("/downLoadAvatar")
    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();
            }
        }

    }

四、测试预览结果

 

posted @ 2022-08-20 10:45  蒂雪凌星  阅读(2127)  评论(0编辑  收藏  举报
Live2D