# minio-study **Repository Path**: juneforgitee/minio-study ## Basic Information - **Project Name**: minio-study - **Description**: minio学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-02 - **Last Updated**: 2024-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、安装 1. 通过docker 安装minio ```shell docker pull minio/minio ``` 2. 创建挂载点 ```shell mkdir -p /opt/docker/minio/data ``` 3. 启动 ```shell #浏览器colsole:9001端口,api端口:9000,MINIO_ROOT_USER和MINIO_ROOT_PASSWORD指定账号密码 docker run -d \-p 9000:9000 \-p 9001:9001 \--name minio --restart=always --privileged=true \-v /opt/docker/minio/data:/data \-e "MINIO_ROOT_USER=minio" \-e "MINIO_ROOT_PASSWORD=minio123" \minio/minio server /data --console-address ":9001" ``` 4. 其他说明 ```tex OPTIONS参数说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; name=“nginx-lb”: 为容器指定一个名称; dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h “mars”: 指定容器的hostname; -e username=“ritchie”: 设置环境变量; env-file=[]: 从指定文件读入环境变量; cpuset=“0-2” or cpuset=“0,1,2”: 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; link=[]: 添加链接到另一个容器; expose=[]: 开放一个端口或一组端口; volume , -v: 绑定一个卷 例如,使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx: docker run name mynginx -d nginx:latest 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口: docker run -P -d nginx:latest 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data: docker run -p 80:80 -v /data:/data -d nginx:latest 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上: docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令: docker run -it nginx:latest /bin/bash ``` # 二、SpringBoot整合Minio ## 1. 依赖 ```xml io.minio minio 8.4.0 cn.hutool hutool-all 5.8.26 io.springfox springfox-swagger2 3.0.0 ``` ## 2. yml配置 ```yml minio: endpoint: http://127.0.0.1:9000 #Minio服务所在地址 bucketName: tulaoda #存储桶名称 accessKey: #访问的key secretKey: #访问的秘钥 ``` ## 3.配置类 ```java @Data @Configuration @ConfigurationProperties(prefix = "minio") public class MinioConfig { private String endpoint; private String accessKey; private String secretKey; private String bucketName; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } } ``` ## 4.minio工具类 ```java import io.minio.messages.Bucket; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.stream.Collectors; /** * File: MinioController * Author: QiYue WU * Date: 2024/4/2 13:51 * Description: */ @Api(tags = "文件相关接口") @RestController @RequiredArgsConstructor @RequestMapping("/minio") public class MinioController { private final MinioUtil minioUtil; private final MinioConfig minioConfig; @ApiOperation(value = "查看存储bucket是否存在") @GetMapping("/bucketExists") public AjaxResult bucketExists(@RequestParam("bucketName") String bucketName) { return AjaxResult.success(bucketName + ":" + (minioUtil.bucketExists(bucketName) ? "存在" : "不存在")); } @ApiOperation(value = "创建存储bucket") @GetMapping("/makeBucket") public AjaxResult makeBucket(String bucketName) { return AjaxResult.success("bucketName", minioUtil.makeBucket(bucketName)); } @ApiOperation(value = "删除存储bucket") @GetMapping("/removeBucket") public AjaxResult removeBucket(String bucketName) { return AjaxResult.success("bucketName", minioUtil.removeBucket(bucketName)); } @ApiOperation(value = "获取全部bucket") @GetMapping("/getAllBuckets") public AjaxResult getAllBuckets() { List allBuckets = minioUtil.getAllBuckets(); //查询name List buckets = allBuckets.stream(). map(Bucket::name).collect(Collectors.toList()); return AjaxResult.success("allBuckets", buckets); } @ApiOperation(value = "文件上传返回url") @PostMapping("/upload") public AjaxResult upload(@RequestParam("file") MultipartFile file) { String objectName = minioUtil.upload(file); if (null != objectName) { return AjaxResult.success("url", (minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + objectName)); } return AjaxResult.error("上传失败"); } @ApiOperation(value = "图片/视频预览") @GetMapping("/preview") public AjaxResult preview(@RequestParam("fileName") String fileName) { return AjaxResult.success("filleName", minioUtil.preview(fileName)); } @ApiOperation(value = "文件下载") @GetMapping("/download") public AjaxResult download(@RequestParam("fileName") String fileName, HttpServletResponse res) { minioUtil.download(fileName, res); return AjaxResult.success("文件下载成功"); } @ApiOperation(value = "删除文件", notes = "根据url地址删除文件") @PostMapping("/delete") public AjaxResult remove(String url) { String objName = url.substring(url.lastIndexOf(minioConfig.getBucketName() + "/") + minioConfig.getBucketName().length() + 1); minioUtil.remove(objName); return AjaxResult.success("objName", objName); } } ``` ## 5.接口 ```java import io.minio.messages.Bucket; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * File: MinioController * Author: QiYue WU * Date: 2024/4/2 13:51 * Description: */ @Api(tags = "文件相关接口") @RestController @RequiredArgsConstructor @RequestMapping("/minio") public class MinioController { private final MinioUtil minioUtil; private final MinioConfig minioConfig; @ApiOperation(value = "查看存储bucket是否存在") @GetMapping("/bucketExists") public AjaxResult bucketExists(@RequestParam("bucketName") String bucketName) { return AjaxResult.success("bucketName",minioUtil.bucketExists(bucketName)); } @ApiOperation(value = "创建存储bucket") @GetMapping("/makeBucket") public AjaxResult makeBucket(String bucketName) { return AjaxResult.success("bucketName",minioUtil.makeBucket(bucketName)); } @ApiOperation(value = "删除存储bucket") @GetMapping("/removeBucket") public AjaxResult removeBucket(String bucketName) { return AjaxResult.success("bucketName",minioUtil.removeBucket(bucketName)); } @ApiOperation(value = "获取全部bucket") @GetMapping("/getAllBuckets") public AjaxResult getAllBuckets() { List allBuckets = minioUtil.getAllBuckets(); return AjaxResult.success("allBuckets",allBuckets); } @ApiOperation(value = "文件上传返回url") @PostMapping("/upload") public AjaxResult upload(@RequestParam("file") MultipartFile file) { String objectName = minioUtil.upload(file); if (null != objectName) { return AjaxResult.success("url",(minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + objectName)); } return AjaxResult.error("上传失败"); } @ApiOperation(value = "图片/视频预览") @GetMapping("/preview") public AjaxResult preview(@RequestParam("fileName") String fileName) { return AjaxResult.success("filleName",minioUtil.preview(fileName)); } @ApiOperation(value = "文件下载") @GetMapping("/download") public AjaxResult download(@RequestParam("fileName") String fileName, HttpServletResponse res) { minioUtil.download(fileName,res); return AjaxResult.success("文件下载成功"); } @ApiOperation(value = "删除文件", notes = "根据url地址删除文件") @PostMapping("/delete") public AjaxResult remove(String url) { String objName = url.substring(url.lastIndexOf(minioConfig.getBucketName()+"/") + minioConfig.getBucketName().length()+1); minioUtil.remove(objName); return AjaxResult.success("objName",objName); } } ``` # 三、其他 ## 1. 文件过大无法上传 ```yaml spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB ``` ## 2.accesskey和secret 通过访问`9001`端口,依次找到:`Administrator->Identity->Users->createUser` 创建用户并授权,保存key和密钥到本地,保存到yaml文件 ## 3.AjaxResult ```java import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor public class AjaxResult implements Serializable { private Integer status; private String msg; private Object data; public static AjaxResult success(){ return new AjaxResult(200, "success", null); } public static AjaxResult success(Object data){ return new AjaxResult(200, "success", data); } public static AjaxResult success(String msg, Object data){ return new AjaxResult(200, msg, data); } public static AjaxResult success(Integer status, String msg, Object data){ return new AjaxResult(status, msg, data); } public static AjaxResult error(String msg){ return new AjaxResult(500, msg, null); } public static AjaxResult error(Integer status, String msg){ return new AjaxResult(status, msg, null); } } ``` ## 4.文件无法访问 进入Colsole,依次找到:`Administrator->Bucket->你的桶名称->Summary->Access Policy` 将访问权限改成public后所有人可访问