docker安装
1、拉取镜像
docker pull minio/minio
2、启动镜像- docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123456" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data
复制代码 重要:
- -p:9000 是图形界面的端口,9001 是 API 的端口,在使用 SDK 毗连需要用到
- MINIO_ACCESS_KEY:指定图形界面的用户名
- MINIO_SECRET_KEY:指定图形界面的暗码
命令参数及选项说明:
- docker run: 这是 Docker 的根本命令,用于运行一个新的容器。
- -p 9000:9000 -p 9001:9001: 使用 -p 或 --publish 选项将主机(宿主机)端口映射到容器内部端口。这里分别做了两个端口映射:
- 9000:9000:将主机的 9000 端口与容器内的 9000 端口绑定,使得外部可以通过主机的 9000 端口访问到容器内运行的服务。
- 9001:9001:同样地,将主机的 9001 端口与容器内的 9001 端口绑定。
- --name minio: 使用 --name 选项指定新创建容器的名称为 minio,便于后续管理和引用。
- -d: 使用 -d 或 --detach 标记使容器在背景以守护进程模式运行,即启动后立刻返回控制台而不阻塞。
- --restart=always: 设置容器的重启策略为 always,这意味着假如容器意外克制(如由于体系重启或故障),Docker 将自动重新启动该容器。
- -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin": 使用 -e 或 --env 选项设置情况变量。这里设置了 MinIO 需要的访问密钥和秘密密钥:
- MINIO_ACCESS_KEY=admin:定义 MinIO 的访问密钥(Access Key),用于身份验证。
- MINIO_SECRET_KEY=admin:定义 MinIO 的秘密密钥(Secret Key),与访问密钥一起构成认证凭据。
- -v /home/data:/data -v /home/config:/root/.minio: 使用 -v 或 --volume 选项挂载主机目录到容器内:
- -v /home/data:/data:将主机上的 /home/data 目录挂载到容器内的 /data 目录,用于存放 MinIO 存储的数据。
- -v /home/config:/root/.minio:将主机上的 /home/config 目录挂载到容器内的 /root/.minio 目录,通常用于保存 MinIO 的配置文件和其他持久化数据。
- minio/minio: 指定要使用的 Docker 镜像,这里是官方的 minio/minio 镜像。
- server: 运行 MinIO 容器时实行的命令,通常为 server,用于启动 MinIO 服务。
- --console-address ":9000" --address ":9001": 通报给 server 命令的 MinIO 特定参数:
- --console-address ":9000":指定 MinIO 管理控制台的监听地址为 :9000,即容器内的所有网络接口都会监听此端口。由于已经做了端口映射,外部可以通过主机的 9000 端口访问控制台。
- --address ":9001":指定 MinIO 服务 API 的监听地址为 :9001,同样对所有网络接口开放。外部可通过主机的 9001 端口与 MinIO API 举行交互。
- /data: 最后的 /data 参数指定了 MinIO 服务的数据目录,纵然用挂载的 /data 目录作为存储桶数据的现实位置。
访问
浏览器输入http://ip:9000/login
图形界面
1、创建桶
2、设置权限
3、获取accessKey 和 secretKey
注意:创建__accessKey 和 secretKey的时候,要注意保存好。
Java毗连Minio(SDK)
1、添加依赖- <dependency>
- <groupId>io.minio</groupId>
- <artifactId>minio</artifactId>
- <version>8.2.1</version>
- </dependency>
复制代码 2、demo- import io.minio.BucketExistsArgs;
- import io.minio.MakeBucketArgs;
- import io.minio.MinioClient;
- import io.minio.UploadObjectArgs;
- import io.minio.errors.MinioException;
- import java.io.IOException;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- public class FileUploader {
- // minio的api 端口(不是图形界面)
- public static String endPoint = "http://xxx.xxx.xxx.xxx:9001/";
-
- public static String accessKey = "YLCS8UYJFX02E70OV7MK";
- public static String secretKey = "不能外露";
- public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
- try {
- // 创建minioClient, 使用上面的endpoint,ak,sk
- MinioClient minioClient =
- MinioClient.builder()
- .endpoint(endPoint)
- .credentials(accessKey, secretKey)
- .build();
- // 如果指定的bucket不存在,则创建,否则使用已有bucket
- // 指定bucket名称
- String bucketName = "test";
- boolean found =
- minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
- if (!found) {
- minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
- } else {
- System.out.println("Bucket '" + bucketName + "' already exists.");
- }
- // 文件来自哪里
- String filePath = "C:\\Users\\DELL\\Pictures\\Saved Pictures\\2.jpg";
- // 存储后的文件名
- String fileName = "minio_test_text.png";
- // 执行文件上传
- minioClient.uploadObject(
- UploadObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .filename(filePath)
- .build());
- System.out.println("'" + filePath + "' 成功上传对象 '" + fileName + "' 到 bucket '" + bucketName + "'.");
- } catch (MinioException e) {
- System.out.println("Error occurred: " + e);
- System.out.println("HTTP trace: " + e.httpTrace());
- }
- }
- }
复制代码 封装工具类
1、配置文件- chuangyue:
- minio:
- # 访问的url
- endpoint: http://xxx.xxx.xxx.xxx
- # API的端口
- port: 9001
- # 秘钥
- accessKey: YLCS8UYJFX02E70OV7MK
- secretKey: 不能看
- secure: false
- bucket-name: test # 桶名 我这是给出了一个默认桶名
- image-size: 10485760 # 我在这里设定了 图片文件的最大大小
- file-size: 1073741824 # 此处是设定了文件的最大大小
复制代码 2、属性配置类- @Component
- @ConfigurationProperties(prefix = "chuangyue.minio")
- @Data
- public class MinioProperties {
- // 访问的 api 的url
- private String endpoint;
- // api端口号
- private String port;
- // 密钥
- private String accessKey;
- private String secretKey;
- private Boolean secure;
- // 桶名
- private String bucketName;
- // 图片文件的最大大小
- private long imageSize;
- // 文件的最大大小
- private long fileSize;
- }
复制代码 3、工具类- package com.zyp.utils;
- import io.minio.*;
- import io.minio.errors.MinioException;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Component;
- import org.springframework.web.multipart.MultipartFile;
- import java.io.IOException;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import java.util.UUID;
- @Component
- @Slf4j
- public class MinioUtil {
-
- /**
- * @ description 上传
- * @param file 文件
- * @param endPoint 访问的地址
- * @param port 端口号
- * @param accessKey 密钥
- * @param secretKey 密钥
- * @param bucketName 桶名称
- * @ return java.lang.String
- * @ author DELL
- */
- public static String upload(MultipartFile file, String endPoint, String port, String accessKey, String secretKey, String bucketName) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
- try {
- // 创建minioClient
- MinioClient minioClient =
- MinioClient.builder()
- .endpoint(endPoint + ":" + port)
- .credentials(accessKey, secretKey)
- .build();
- // 如果指定的bucket不存在,则创建,否则使用已有bucket
- boolean found =
- minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
- if (!found) {
- minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
- } else {
- log.info("Bucket {} already exists", bucketName);
- }
- // 获取文件原始名称
- String oringinalName = file.getOriginalFilename();
- // 获取后缀
- String suffix = oringinalName.substring(oringinalName.lastIndexOf('.'));
- // 拼接存储后的文件名
- String fileName = UUID.randomUUID().toString() + suffix;
- PutObjectArgs putObjectArgs = PutObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .stream(file.getInputStream(), file.getSize(), -1)
- .contentType(file.getContentType())
- .build();
- minioClient.putObject(putObjectArgs);
- log.info("文件上传成功");
- // 拼接url并返回
- return endPoint + ":" + port + "/" + bucketName + "/" + fileName;
- } catch (MinioException e) {
- System.out.println("Error occurred: " + e);
- System.out.println("HTTP trace: " + e.httpTrace());
- return "error";
- }
- }
- }
复制代码 4、使用,定义一个文件上传的接口- @RestController
- @Slf4j
- public class FileUploadController {
- @Autowired
- private MinioProperties minioProperties;
- /**
- * @ description 文件上传
- * @param file
- * @ return com.zyp.pojo.Result<java.lang.String>
- * @ author DELL
- */
- @PostMapping("/upload")
- public Result<String> upload(MultipartFile file) throws Exception {
- String url = MinioUtil.upload(file, minioProperties.getEndpoint(), minioProperties.getPort(), minioProperties.getAccessKey(), minioProperties.getSecretKey(), minioProperties.getBucketName());
- log.info("url= {}",url);
- if(url.isEmpty() || url.equals("error")){
- throw new UploadErrorException("文件上传失败");
- }else{
- return Result.success(url);
- }
- }
- }
复制代码 常见问题
1、tomcat限制了文件上传或者下载的大小
解决:修改配置文件- spring:
- servlet:
- multipart:
- max-file-size: 50MB
- max-request-size: 50MB
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |