• Java整合minio实现文件预览上传和下载


    minio 在windows系统安装和使用

    最近在使用minio做图片存储,在使用过程中遇到一些问题,总结记录下来。这里不对minio做过多介绍,具体资料自行查找.

    1、官网地址 https://min.io/

    2、github地址 https://github.com/minio/minio

    3、windows 服务端下载地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe

    4、安装启动

    启动一个cmd窗口,进入minio.exe所在文件夹,输入如下命令    注:miniodata是需自己创建图片上传之后的存储目录

    .\minio.exe server H:\DevelopTools\miniodata
    

    运行成功之后,会看到下面的界面

     使用命令行界面给出的地址都可以登录,账号密码都在地址下面。登录后如下图所示。

    在后台管理界面上你可以创建你的Bucket(桶),可以理解为一个文件夹用来存放图片。桶创建成功之后就可以上传图片了

    springboot整合minio实现文件预览上传和下载

     第一步:引入依赖

     <!--存储文件依赖-->
     <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.1.0</version>
    </dependency>

    第二步:配置参数类

    /**
     * minio相关配置 也可以配置在yml文件
     */
    @Component
    public class ParamConfig {
    
        public static String endpoint = "http://127.0.0.1:9000";
        public static String accessKey = "minioadmin";
        public static String secretKey = "minioadmin";
        public static String bucketName = "uavtest";
    
    }

    第三步:添加MinIoUtil

    import cn.hutool.core.date.DateUtil;
    import io.minio.MinioClient;
    import io.minio.PutObjectOptions;
    import io.minio.messages.Bucket;
    import lombok.SneakyThrows;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.annotation.PostConstruct;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    /**
     * Minio工具类
     */
    @Slf4j
    @Component
    public class MinIoUtil {
    
        public static MinioClient minioClient;
    
        public static ParamConfig paramConfig;
    
        /**
         * 初始化minio配置
         */
        @PostConstruct
        public void init() {
            try {
                log.info("Minio Initialize........................");
                minioClient = MinioClient.builder().endpoint(paramConfig.endpoint).credentials(paramConfig.accessKey, paramConfig.secretKey).build();
                createBucket(paramConfig.bucketName);
                log.info("Minio Initialize........................successful");
            } catch (Exception e) {
                e.printStackTrace();
                log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());
            }
        }
    
        /**
         * 判断bucket是否存在
         */
        @SneakyThrows(Exception.class)
        public static boolean bucketExists(String bucketName) {
            return minioClient.bucketExists(bucketName);
        }
    
        /**
         * 创建bucket
         */
        @SneakyThrows(Exception.class)
        public static void createBucket(String bucketName) {
            boolean isExist = minioClient.bucketExists(bucketName);
            if (!isExist) {
                minioClient.makeBucket(bucketName);
            }
        }
    
        /**
         * 获取全部bucket
         */
        @SneakyThrows(Exception.class)
        public static List<Bucket> getAllBuckets() {
            return minioClient.listBuckets();
        }
    
        /**
         * 文件上传
         *
         * @param bucketName: 桶名
         * @param fileName:   文件名
         * @param filePath:   文件路径
         */
        @SneakyThrows(Exception.class)
        public static void upload(String bucketName, String fileName, String filePath) {
            minioClient.putObject(bucketName, fileName, filePath, null);
        }
    
        /**
         * 上传文件
         * 返回可以直接预览文件的URL
         */
        public static String uploadFile(MultipartFile file) {
            try {
                //如果存储桶不存在则创建
                if (!bucketExists(ParamConfig.bucketName)) {
                    createBucket(ParamConfig.bucketName);
                }
                PutObjectOptions putObjectOptions = new PutObjectOptions(file.getInputStream().available(), -1);
                putObjectOptions.setContentType(file.getContentType());
                String originalFilename = file.getOriginalFilename();
                //得到文件流
                InputStream inputStream = file.getInputStream();
                //保证文件不重名(并且没有特殊字符)
                String fileName = ParamConfig.bucketName + DateUtil.format(new Date(), "_yyyyMMddHHmmss") + originalFilename;
                minioClient.putObject(ParamConfig.bucketName, fileName, inputStream, putObjectOptions);
                return getPreviewFileUrl(ParamConfig.bucketName, fileName);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
    
        /**
         * 文件上传
         * 返回下载文件url地址 和下面upload方法仅传参不同
         * bucketName 也可以直接从ParamConfig对象中获取
         */
        @SneakyThrows(Exception.class)
        public static String upload(String bucketName, String fileName, InputStream stream) {
            minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
            return getPreviewFileUrl(bucketName, fileName);
        }
    
        /**
         * 文件上传
         * 返回下载文件url地址  和上面upload方法仅传参不同
         */
        @SneakyThrows(Exception.class)
        public static String upload(String bucketName, MultipartFile file) {
            final InputStream is = file.getInputStream();
            final String fileName = file.getOriginalFilename();
            minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
            is.close();
            return getPreviewFileUrl(bucketName, fileName);
        }
    
        /**
         * 删除文件
         *
         * @param bucketName: 桶名
         * @param fileName:   文件名
         */
        @SneakyThrows(Exception.class)
        public static void deleteFile(String bucketName, String fileName) {
            minioClient.removeObject(bucketName, fileName);
        }
    
        /**
         * 下载文件
         */
    //    @SneakyThrows(Exception.class)
    //    public static void download(String bucketName, String fileName, HttpServletResponse response) {
    //        // 获取对象的元数据
    //        final ObjectStat stat = minioClient.statObject(bucketName, fileName);
    //        response.setContentType(stat.contentType());
    //        response.setCharacterEncoding("UTF-8");
    //        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
    //        InputStream is = minioClient.getObject(bucketName, fileName);
    //        IOUtils.copy(is, response.getOutputStream());
    //        is.close();
    //    }
    
        /**
         * 获取minio文件的下载或者预览地址
         * 取决于调用本方法的方法中的PutObjectOptions对象有没有设置contentType
         *
         * @param bucketName: 桶名
         * @param fileName:   文件名
         */
        @SneakyThrows(Exception.class)
        public static String getPreviewFileUrl(String bucketName, String fileName) {
            return minioClient.presignedGetObject(bucketName, fileName);
        }
    
    }

    第四步:接口中引用

     @ResponseBody
        @PostMapping("/tFlightFileUpload")
        @ApiOperation(value = "文件上传管理-添加minio")
        public Response add(@RequestParam("file") MultipartFile file) throws IOException {
            String url = MinIoUtil.uploadFile(file);
            return Response.success(url);
        }

    注:仔细看工具类中的方法上的注释 可以返回预览文件和下载文件的URL

  • 相关阅读:
    JDBC连接数据库的四种方式:DriverManager,DataSource,DBCP,C3P0
    下面代码打印的结果?
    当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B?
    线程的sleep()方法和yield()方法有什么区别?
    今天,想说一说明星涉毒
    【译文】为什么用户体验文案在产品设计中如此重要?
    【译文】东京的外国工程师
    浅谈K8S cni和网络方案
    网易云易盾发布多国家多语种内容安全服务,助力中国互联网出海
    如何着手商业数据分析?
  • 原文地址:https://www.cnblogs.com/wffzk/p/15961335.html
Copyright © 2020-2023  润新知