Minio文件上传实战

前言:

本文涉及知识范围包括腾讯云服务器、docker、Minio、springBoot集成Minio 相关知识, 相信读者对这些知识已是能信手拈来, 在这里,你可以看到我以下实战:

  • docker集成Minio,并启动Minio服务
  • springBoot集成Minio,上传图片、视频、日志文件等数据到Minio服务器上

相信屏幕前的你,已经掌握了在云服务器使用docker的常规使用,在这里,直接从docker下载Minio开始

docker集成Minio

在腾讯云服务器控制台(OrcaTerm)输入如下命令(注:有权限校验的时候,暂时又不想去配置相关权限的,可以直接在命令前加sudo(MacOs系统)),下载Minio镜像:

shell 复制代码
docker pull bitnami/minio

下载成功Minio镜像后,为Minio创建数据卷目录:

shell 复制代码
mkdir -p /minio_01/data

docker启动一个Minio镜像:

shell 复制代码
docker run -it -d --name minio -p 9000:9000 -p 9001:9001 -v /minio/data:/data -e MINIO_ROOT_USER="minio_root" -e MINIO_ROOT_PASSWORD="minio_admin_12345" bitnami/minio:latest

参数注解:

  1. -it:以交互的模式启动容器
  2. -d:以守护进程方式启动容器
  3. -p:指定端口号,如果不想设定可以使用-P
  4. -v:是挂载数据卷的,作用就是,对数据进行备份,可以防止误删
  5. -e:是配置项,在这里配置静态key/value,是的,打开Minio服务的用户名和密码

运行启动命令后,可以看看Minio启动后的日志:

shell 复制代码
docker logs minio -f

效果如下:

到这里,就已经在docker集成并启动了Minio服务了。 想通过云服务器公网ip访问,需要在云服务器防火墙模板配置允许访问防火墙,创建模板minio:

配置完两个可访问端口号后,需要在设置实例防火墙操作项中,添加你的云服务器在实例中才可以在浏览器访问:ip+9001 或如绑定了域名,域名+9001访问Minio服务器

输入在dokcer启动Minio服务时日志中的RootUser和RootPass就可以登录进入Minio可视化系统了:

到这里,你可以在可视化系统里手动创建BucketName并上传、下载文件,但,本文的目的是,通过springBoot集成Minio链接Minio服务地址创建BucketName并实现前后端分离上传自媒体文件。

springBoot集成Minio

在这里直接上代码

java 复制代码
@ApiOperation(value = "文件上传")
@PostMapping(value = "/upload",headers = "content-type=multipart/form-data")
public CommonResult upload(@RequestPart("file") MultipartFile file){
   try{
       // 创建一个MinIO的java客户端,xxx.xx.xxx.xx是你的服务器ip或域名
       // ACCESS_KEY和SECRET_KEY在Minio可视化系统里生成
       // BUCKET_NAME:需要符合BucketName的命名规则,全是小写的就可以:supermall
       MinioClient minioClient = MinioClient.builder()
               .endpoint("http://xxx.xx.xxx.xx",9000,false)
               .credentials("ACCESS_KEY","SECRET_KEY")
               .build();
       boolean isExit = minioClient.bucketExists(BucketExistsArgs.builder().bucket("supermall").build());
       if(isExit){
           LOGGER.info("存储桶已经存在");
       }else {
           // 创建存储桶并设置只读权限
           minioClient.makeBucket(MakeBucketArgs.builder().bucket("supermall").build());
           BucketPolicyConfig bucketPolicyConfig = createBucketPolicyConfig("supermall");
           SetBucketPolicyArgs bucketPolicyArgs = SetBucketPolicyArgs.builder()
                   .bucket("supermall")
                   .config(JSONUtil.toJsonStr(bucketPolicyConfig))
                   .build();
           minioClient.setBucketPolicy(bucketPolicyArgs);
       }
       String filename = file.getOriginalFilename();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
       // 设置存储对象名称
       String objectName = sdf.format(new Date())+"/"+filename;
       // 使用putObject上传一个文件到存储桶中
       PutObjectArgs putObjectArgs = PutObjectArgs.builder()
               .bucket("supermall")
               .object(objectName)
               .contentType(file.getContentType())
               .stream(file.getInputStream(),file.getSize(),ObjectWriteArgs.MIN_MULTIPART_SIZE)
               .build();
       minioClient.putObject(putObjectArgs);
       LOGGER.info("文件上传成功!");
       MinioUpload minioUpload = new MinioUpload();
       minioUpload.setName(filename);
       minioUpload.setUrl(ENDPOINT + "/" + "supermall" + "/" + objectName);
       return CommonResult.success(minioUpload);
   }catch (Exception e){
       e.printStackTrace();
       LOGGER.info("上传发生错误:{}!",e.getMessage());
   }
    return CommonResult.failed();
}

启动项目后访问接口(演示是使用swagger测试的):

同时在Minio服务器系统也能看到上传的文件:

结语

Minio文件上传实践到这里分享完了,这是一个完整的文件上传过程,希望读者有所收获,共勉!!!

相关推荐
不想秃头的程序员5 小时前
Vue3 封装 Axios 实战:从基础到生产级,新手也能秒上手
前端·javascript·面试
Sayuanni%35 小时前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐5 小时前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
爱装代码的小瓶子5 小时前
【C++与Linux基础】进程间通讯方式:匿名管道
android·c++·后端
疯狂敲代码的老刘5 小时前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除5 小时前
js--15
java·jvm·spring
数研小生5 小时前
亚马逊商品列表API详解
前端·数据库·python·pandas
你听得到116 小时前
我彻底搞懂了 SSE,原来流式响应效果还能这么玩的?(附 JS/Dart 双端实战)
前端·面试·github
不倒翁玩偶6 小时前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
前端·npm·node.js