Minio入门教学

Minio 文件存储系统

以往的项目,用的比较多的OSS服务是腾讯云和阿里云的存储服务,最近的几个项目,普遍要使用Minio,所以我在开发服务器和测试服务器上都装上了minio.

一、首先minio的安装

采用docker安装(因为docker安装简单快速)

如果没用过docker的同学请先看我之前发的文章,已经讲解过如何安装docker

1.拉取docker镜像

docker pull minio/minio

2.创建文件宿主机存储目录

一个用来存放配置,一个用来存储上传文件的目录

启动前需要先创建Minio外部挂载的配置文件( /home/minio/config),和存储上传文件的目录( /home/minio/data)

mkdir -p /home/minio/config
mkdir -p /home/minio/data

3.创建Minio容器并运行

docker run -p 9000:9000 -p 9099:9099 \
     --net=bridge \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=fsp-manage" \
     -e "MINIO_SECRET_KEY=springboot-fsp-manage" \
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9099" -address ":9000"

!!注意:因为mobalXterm 连接虚拟机后,会占用9090端口作为web console,所以此处改变端口9099
fsp-manage 是UI控制台登录账户(运行minio后访问,http://192.168.64.138:9099/login)
springboot-fsp-manage 是UI控制台登录密码(运行minio后访问,http://192.168.64.138:9099/login)

4.访问操作

http://serverUrl:9099/login

“serverUrl” 为自己服务器(虚拟机) 用户名,密码如上述
在这里插入图片描述

5.进入控制台点击buckets创建一个桶名称为fsp-dev

在这里插入图片描述

二.接下来就是整合spingboot项目

Java入门 点击该链接跳转到gitee,即可查看整合springboot后的项目

在这里插入图片描述

核心代码之上传文件至Minio

@PostMapping(value = {"/admin/uploadFile","/web/uploadFile"})
    @ApiOperation(value = "上传文件,支持批量上传")
    @ApiImplicitParam(name = "files",value = "文件对象",dataType = "File")
    public ApiResult uploadFile(@RequestParam("files") List<MultipartFile> files) {
        log.info(files.toString());
        if (CollectionUtils.isEmpty(files)) {
            return ApiResult.error("未选择文件!");
        }

        List<MinioResponseDTO> MinioResponseDTOList = new ArrayList<>();
        for (MultipartFile file : files) {
            String originalFilename = file.getOriginalFilename();
//            获取文件拓展名
            String extName = FileUtil.extName(originalFilename);
            log.info("文件拓展名:" + extName);
//            生成新的文件名,存入到minio
            long millSeconds = Instant.now().toEpochMilli();
            String minioFileName = millSeconds + RandomStringUtils.randomNumeric(12) + "." + extName;
            String contentType = file.getContentType();
            log.info("文件mime:{}", contentType);
//            返回文件大小,单位字节
            long size = file.getSize();
            log.info("文件大小:" + size);
            try {
                String bucketName = minioConfig.getBucketName();
                minioClientUtils.putObject(bucketName, file, minioFileName);
                String fileUrl = minioClientUtils.getObjectUrl(bucketName, minioFileName);
                MinioFile minioFile = new MinioFile();
                minioFile.setOriginalFileName(originalFilename);
                minioFile.setFileExtName(extName);
                minioFile.setFileName(minioFileName);
                minioFile.setFileSize(size);
                minioFile.setMime(contentType);
                minioFile.setIsDelete(NumberUtils.INTEGER_ZERO);
                minioFile.setFileUrl(fileUrl);
                boolean insert = minioFile.insert();
                if (insert) {//文件地址写入数据库
                    MinioResponseDTO minioResponseDTO = new MinioResponseDTO();
                    minioResponseDTO.setFileId(minioFile.getId());
                    minioResponseDTO.setOriginalFileName(originalFilename);
                    minioResponseDTO.setFileUrl(fileUrl);
                    MinioResponseDTOList.add(minioResponseDTO);
                }
            } catch (Exception e) {
                log.error("上传文件出错:{}", e);
                return ApiResult.error("上传文件出错");
            }
        }
        return ApiResult.success(MinioResponseDTOList);
    }

核心代码之从minio下载文件至浏览器(也可前端展示)

 @GetMapping("/getPicture")
    public void downloadFile(@RequestParam("fileUrl") String fileUrl, HttpServletResponse response) throws IOException {
        if (StringUtils.isBlank(fileUrl)){
            response.setHeader("Content-type","text/html;charset=UTF-8");
            String msg = "文件下载失败";
            OutputStream ps = response.getOutputStream();
            ps.write(msg.getBytes(StandardCharsets.UTF_8));
            return;
        }
        try {
            //拿到文件路径
            String url = fileUrl.split("9000/")[1];
            //获取文件对象
            InputStream object = minioClientUtils.getObject(MinioConstant.FSP_DEV, url.substring(url.indexOf("/") + 1));
            byte[] bytes = new byte[1024];
            int len = 0;
            response.reset();
            response.setHeader("Content-Disposition","attachment/filename="+
                    URLEncoder.encode(url.substring(url.lastIndexOf("/")+1),"UTF-8"));
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("UTF-8");
            OutputStream stream = response.getOutputStream();
            while ((len = object.read(bytes))>0){
                stream.write(bytes,0,len);
            }
            stream.close();
        }catch (Exception e){
            response.setHeader("Content-type","text/html;charset=UTF-8");
            String data = "文件下载失败";
            OutputStream ps = response.getOutputStream();
            ps.write(data.getBytes(StandardCharsets.UTF_8));
        }
    }
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闪耀太阳a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值