SpringBoot + minio + kkfile 实现文件预览

科技   2024-11-08 17:21   江苏  

点击关注公众号,Java干货及时送达

来源:juejin.cn/post/7407384172049891379

    1、容器安装kkfileviewer

    1.1 下载文件

    这里以kkfile 4.4.0-beta版本为例

    下载kkfile安装包及Dockerfile:

    https://codeup.aliyun.com/6254dee9a923b68581caaf50/kkfileviewer.git

    1.2、构建镜像

    git clone https://codeup.aliyun.com/6254dee9a923b68581caaf50/kkfileviewer.git
    cd kkfileviewer
    docker build -t kkfileview:v4.4.0 .

    1.3、 启动kkfileviewer

    docker run -d -p 8012:8012 --name kkfileview kkfileview:v4.4.0

    1.4、 访问测试

    http://you-ip:8012

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
    • 视频教程:https://doc.iocoder.cn/video/

    2、springboot集成minio

    2.1 pom.xml添加依赖

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

    2.2、 配置


    > 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
    >
    > * 项目地址:<https://github.com/YunaiV/yudao-cloud>
    > * 视频教程:<https://doc.iocoder.cn/video/>

    # minio 文件存储配置信息
    minio:
      endpoint: http://xxxxx:9000
      accessKey: xxxx
      secretKey: xxxxx
      bucketName: test

    2.3、minio配置类

    package com.sunny.config;

    import io.minio.MinioClient;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class MinioConfig {

        @Value("${minio.endpoint}")
        private String endPoint;

        @Value("${minio.accessKey}")
        private String accessKey;

        @Value("${minio.secretKey}")
        private String secretKey;

        @Value("${minio.bucketName}")
        private String bucketName;


        @Bean
        protected MinioClient minioClient(){
            return MinioClient.builder()
                    .endpoint(endPoint)
                    .credentials(accessKey, secretKey)
                    .build();
        }
    }

    2.4、 minio工具类

    package com.sunny.utils;

    import com.sunny.entity.common.ApiResult;
    import com.sunny.exception.AppException;
    import io.minio.GetPresignedObjectUrlArgs;
    import io.minio.MinioClient;
    import io.minio.PutObjectArgs;
    import io.minio.http.Method;
    import jakarta.annotation.Resource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;

    import java.io.InputStream;

    @Component
    public class MinioUtils {

        @Value("${minio.bucketName}")
        private String bucketName;

        @Resource
        private MinioClient minioClient;

        public ApiResult uploadFile(MultipartFile file) throws AppException {
            String fileName = System.currentTimeMillis() + file.getOriginalFilename();
            try (InputStream fi = file.getInputStream()) {
                PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket(bucketName).contentType(file.getContentType()).object(fileName).stream(fi, fi.available(), -1).build();
                minioClient.putObject(putObjectArgs);
            } catch (Exception e) {
                throw new AppException("文件上传失败" + e.getMessage());
            }
            return ApiResult.ok(fileName);
        }

        public ApiResult getPreviewUrl(String objectName) throws AppException {
            try {
                GetPresignedObjectUrlArgs urlArgs = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();
                return ApiResult.ok(minioClient.getPresignedObjectUrl(urlArgs));
            } catch (Exception e) {
                throw new AppException("获取预览链接失败" + e.getMessage());
            }
        }
    }

    2.5、接口

    package com.sunny.controller;

    import com.sunny.entity.common.ApiResult;
    import com.sunny.exception.AppException;
    import com.sunny.utils.MinioUtils;
    import jakarta.annotation.Resource;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;

    @RestController
    @RequestMapping("/file")
    public class FileOperationController {

        @Resource
        private MinioUtils minioUtils;

        @PostMapping("/upload")
        public ApiResult upload(MultipartFile file) throws AppException {
            return minioUtils.uploadFile(file);
        }

        @GetMapping("/getPreviewUrl")
        public ApiResult getPreviewUrl(String fileName) throws AppException {
            return minioUtils.getPreviewUrl(fileName);
        }
    }

    3、测试

    3.1、上传文件

    3.2、获取minio文件预览地址

    3.1中返回一个文件名,该文件名为上传文件在minio中的唯一名称,使用该名称请求minio文件预览地址

    3.3、文件预览

    3.2中的接口返回一个地址,将地址放到kkfileviewer文件预览服务中,可以预览文件

      

    1、运维一觉睡醒“天塌了”!微软Windows Server更新出乱:2022就地自动升级为2025

    2、SpringBoot控制层中,@Service可以完全替代@Controller吗?

    3、巧用 SpringEvent 解决 WebUploader 大文件上传解耦问题

    4、美团一面:Spring Cloud 远程调用为啥要采用 HTTP,而不是 RPC?

    5、相比高人气的Rust、Go,为何 Java、C 在工具层面进展缓慢?

    6、再见 MybatisPlus,阿里推出新 ORM 框架更牛X

    点在看

    Java技术迷
    专注于计算机编程语言知识分享。主要包括Java基础技术、数据结构、相关工具、spring Cloud、intellij idea......,送书、送红包福利等你来!
     最新文章