minio 的文件上传
需要5个要素: - url minio的地址,http://10.0.0.10:9000 前面的http不要遗漏,否则地址不正确 - accessKey 相当于账号 - secretKey 相当于密码 - bucket 存放文件的桶,相当于文件夹 - file 要上传的文件,来源可以是本地,或是前端。
创建用户,并生成accessKey与secretKey
除了本地的或前端的文件和已知的minio的地址,剩下的三个需要在minio中获取。
由于安装时的主用户权限大,比较不安全,阿里云oss也是一样的,可以注册一个新用户,然后使用新用户创建、上传。
-
登陆minio之后,点击identity下的User,然后点击Create User
-
填写 User Name 和 Password ,然后在select Policy选择readwrite(可读写),然后 save 保存
-
登陆新用户
-
Create Bucket (创建Bucket) 那么bucket的名字就设置好了
其实也可以在Java中创建Bucket也行。
-
左侧菜单栏中选择access Keys
-
Create Access Key,获取两个key 点击create之后,会提示这个secretkey只显示一次,你可以下载那个key,不过也可以在此处截图或者复制保存,点击关闭就可。
-
创建完成
接下来转到Java。
Java 使用Minio
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
配置配置文件
可以将相关配置配置到application.yml文件中
# 服务的端口好
server:
port: 8080
# 用于设置前端上传限制大小,避免过大的文件无法上传,根据个人需求修改
spring:
servlet:
multipart:
max-request-size: 10MB
max-file-size: 100MB
# 设置Minio
minio:
url: http://10.0.0.10:9000
accessKey: CK57MeVmAjCpiboK3sNa
secretKey: Ht9toQf9mBcP68Kw4XkAe0K00p656xYMWfFI6YFd
# 需要创建或创建好的bucket
bucket: image
创建Minio对应的实体类,并注入IOC容器
package com.example.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
@ConfigurationProperties("minio")
public class Minio {
private String url;
private String accessKey;
private String secretKey;
private String bucket;
}
上传的controller
package com.example.controller;
import com.example.entity.Minio;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@RestController
@Slf4j
public class Load {
@Autowired
private Minio minio;
// 前端上传
@PostMapping("/upload")
public String upload(MultipartFile file) throws ServerException,
InsufficientDataException, ErrorResponseException,
IOException, NoSuchAlgorithmException, InvalidKeyException,
InvalidResponseException, XmlParserException, InternalException {
// 创建客户端
MinioClient client = MinioClient.builder()
.endpoint(minio.getUrl())
.credentials(minio.getAccessKey(), minio.getSecretKey()).build();
// 查看bucket是否存在,如不不存在,则创建
boolean b = client.bucketExists(BucketExistsArgs.builder().bucket(minio.getBucket()).build());
if (!b){
log.info("bucket不存在,正在创建...");
client.makeBucket(MakeBucketArgs.builder().bucket(minio.getBucket()).build());
}else{
log.info("bucket已存在,无需创建...");
}
// 向minio上传文件 方式1 流的方式上传
client.putObject(PutObjectArgs.builder()
// 选择上传的bucket
.bucket(minio.getBucket())
// 上传到bucket后文件文件名,可以添加路径,如/xxx/xx.png 也可设置成其他的如UUID生成的名字
.object(file.getOriginalFilename())
// 使用流的方式传输,后面是文件的大小,最后的是缓冲取的大小,-1表示自动设置大小
.stream(file.getInputStream(), file.getSize(), -1)
.build());
// 向minio上传文件 方式2: 先上传到服务器,再上传到minio,本质上这中方式比较适合本地上传
String path = "E:\\projects\\Minio\\Minio\\images\\";
File file1 = new File(path+file.getOriginalFilename());
// 写入到本地
file.transferTo(file1);
client.uploadObject(UploadObjectArgs.builder()
// 指定bucket
.bucket(minio.getBucket())
// 指定在bucket中的名字
.object("upload-"+file.getOriginalFilename())
// 上传文件的本地地址
.filename(path+file.getOriginalFilename())
.build());
// 删除
file1.delete();
// 如果需要返回下载地址
String url = client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
// 使用方法获取
.method(Method.GET)
// 设置从哪个bucket取
.bucket(minio.getBucket())
// 在bucket取哪个文件
.object(file.getOriginalFilename())
.build());
return url;
}
}
注意
创建的bucket默认是private私有的,返回的URL有签名,如果不用签名,可以在minio中设置bucket的access policy private 返回的URL
http://10.0.0.10:9000/images/%E5%8D%8A%E7%82%B9%E5%BF%83%20-%20%E8%8D%89%E8%9C%A2.mp3?
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=CK57MeVmAjCPiboK3sNa%2F20240705%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20240705T144423Z&
X-Amz-Expires=604800&
X-Amz-SignedHeaders=host&
X-Amz-Signature=007b5309608720560691a9bc4877c57944cebcb7c7b1d20c7e27ac39138f291b
?后面的就是签名认证、过期时间、签名头之类的,如果没有是不能够访问到的
设置成public之后,返回的url也是一样的,但是没有后面的签名认证也是可以访问到的
参考文档
最后
示例代码已上传至gitee