• springCloud 微服务通过minio实现文件上传和文件下载接口


     直接上代码吧,好多文章的下载都写的不明不白的,让人理解错,气死了!!

    文件上传功能

    文件上传很简单,首先你得部署好minio,然后写好配置信息,我的是动态读取nacos上配置的yml

    业务层:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    @Autowired
        private MinioConfig minioConfig;
     
        @Autowired
        private MinioClient client;
      
        @Autowired
        private FileInfoMapper fileInfoMapper;
     
    /**
     * 本地文件上传接口
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String fileName = FileUploadUtils.extractFilename(file);
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(file.getInputStream(), file.getSize(), -1)
                .contentType(file.getContentType())
                .build();
        client.putObject(args);
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }
         /**
       * 这个属于业务了,可以参考 
         * 文件存储路径:
         * 业务功能名文件夹+文件UUID+文件类型后缀
         * @param file 上传的文件
         * @param fileInfo 文件信息表:存储了上传标识等信息(用于区分各个微服务下的各个业务,后面可通过这个标识区分这文件是哪个业务的)
         * @return
         * @throws Exception
         */
        @Override
        public int uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception
        {
            //文件UUID
            String uuid= IdUtils.fastSimpleUUID();
            //文件目录名称
            String fileName = FileUploadUtils.extractFilenameByUuid(file, uuid);
            // 文件路径
            String url = fileInfo.getSid()+ "/" + fileName;
     
            PutObjectArgs args = PutObjectArgs.builder()
                    .bucket(minioConfig.getBucketName())
                    .object(fileInfo.getSid()+ "/" + fileName)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build();
            client.putObject(args);
     
            //上传到minio后,将文件信息保存
            fileInfo.setUid(uuid);
            fileInfo.setFileName(file.getOriginalFilename());
            fileInfo.setFileSize(file.getSize());
            fileInfo.setFileType(FileUploadUtils.getExtension(file));
            fileInfo.setFilePath(url);
            fileInfo.setCreateBy(SecurityUtils.getUsername());
            fileInfo.setCreateTime(DateUtils.getNowDate());
            return fileInfoMapper.insertFileInfo(fileInfo);
        } 

    文件下载功能

    这里遇到个理解错误的消息,minio提供的getObject方法和downloadObject方法:

    1. getObject

    GetObject接口用于获取某个文件(Object)。

    此操作需要对此Object具有读权限。

    获取对象的数据。

    InputStream使用后返回必须关闭以释放网络资源。

    2. downloadObject

    将对象的数据下载到文件

    我以为downloadObject就是下载的意思(毕竟英文名也是下载的意思),结果他就是不是下载,而是下载到文件。

    下载主要参数是文件保存的目录地址,如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png,而不是这样子的:http://192.168.8.116:9000/test/2022/05/11/logo_20220511103344A001.png

    因为:http://192.168.1.1:9000/test/   minio会直接在这下面开始查,test为桶名称bucketName

    业务层:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Autowired
     private MinioConfig minioConfig;
     
     @Autowired
     private MinioClient client;
      
     /**
      * 下载文件
      * @param fileName 下载目录地址 如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png
      * @param outputStream http请求中的outputStream
      */
     @Override
     public void  download(String fileName, ServletOutputStream outputStream)
     {
         try (InputStream inputStream = client.getObject(GetObjectArgs
                 .builder()
                 .bucket(minioConfig.getBucketName())
                 .object(fileName)
                 .build()))
         {
             IOUtils.copy(inputStream, outputStream);
         }
         catch (Exception e)
         {
             log.error("文件下载异常");
             e.printStackTrace();
         }
     }

    控制层

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
     * 下载文件
     * @param uid 文件uid
     * @param response
     * @throws Exception
     */
    @GetMapping("/download/{uid}")
    public void download(@PathVariable("uid") String uid,HttpServletResponse response) throws Exception
    {
        //根据文件UUID,查询文件表,得到文件路径目录
        String fileName = fileInfoService.selectFilePathById(uid);
        System.out.println(fileName);
        //调用业务层下载方法
        sysFileService.download(fileName,response.getOutputStream());
    } 

    __EOF__

  • 本文作者: 写一行代码二次元老婆全白给了
  • 本文链接: https://www.cnblogs.com/lin02/p/16256997.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题
    Scala入门到精通(尚硅谷学习笔记)章节四——输入和输出
    体细胞杂交第六弹!worthington组织培养术语终章
    《Vue入门到精通系列之五》--- vue-router详解
    【Python】基本数据类型(四)字符串类型的操作
    React18学习
    C和指针 第15章 输入/输出函数 15.14 流错误函数
    vue 放大镜(简易)
    速腾激光雷达 RS M1 slam 建图
    JavaScript 发布-订阅设计模式实现 React EventBus(相当于vue的$Bus)非父子之间通信
  • 原文地址:https://www.cnblogs.com/lin02/p/16256997.html