minio上传文件
0 Linux部署Minio
0.1 获取MinIO安装包
MinIO官网:https://min.io/
下载地址如下:https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm
通过以下命令可直接将安装包下载至服务器
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm
0.2 安装MinIO
rpm -ivh minio-20230809233022.0.0.x86_64.rpm
0.3 集成systemd
0.3.1 编写MinIO服务配置文件
Systemd所管理的服务需要由一个配置文件进行描述,这些配置文件均位于/etc/systemd/system/
或者/usr/lib/systemd/system/
目录下,下面创建MinIO服务的配置文件。
执行以下命令创建并打开minio.service
文件
vim /etc/systemd/system/minio.service
内容如下:
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
注意:
重点关注上述文件中的以下内容即可
EnvironmentFile
,该文件中可配置MinIO服务所需的各项参数ExecStart
,该参数用于配置MinIO服务的启动命令,其中$MINIO_OPTS
、$MINIO_VOLUMES
,均引用于EnvironmentFile
中的变量。MINIO_OPTS
用于配置MinIO服务的启动选项,可省略不配置。MINIO_VOLUMES
用于配置MinIO服务的数据存储路径。
Restart
,表示自动重启
0.3.2 编写EnvironmentFile
文件
执行以下命令创建并打开/etc/default/minio
文件
vim /etc/default/minio
内容如下:
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
MINIO_VOLUMES=/data
MINIO_OPTS="--console-address :9001"
注意
-
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
为用于访问MinIO的用户名和密码,密码长度至少8位。 -
MINIO_VOLUMES
用于指定数据存储路径,需确保指定的路径是存在的,可执行以下命令创建该路径。mkdir /data
-
MINIO_OPTS
中的console-address
,用于指定管理页面的地址。
0.4 启动MinIO
执行以下命令启动MinIO
systemctl start minio
执行以下命令查询运行状态
systemctl status minio
设置MinIO开机自启
systemctl enable minio
0.5 访问MinIO管理页面
管理页面的访问地址为:http://IP:9001
开放9000和9001端口,9000为API访问端口,9001为MinIO后台管理页面端口
1 编写代码上传文件
1.1 添加maven依赖包
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<!-- 识别自定义属性类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
1.2 创建自定义属性类并配置xml属性
自定义属性类:
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
}
yml文件:
minio:
endpoint: http:/IP:9000
access-key: minioadmin
secret-key: minioadmin
bucket-name: bucketName
1.3 创建MinIO配置类
@Configuration
@ConditionalOnProperty(name = "minio.endpoint")
public class MinioConfiguration {
@Autowired
private MinioProperties minioProperties;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(minioProperties.getEndpoint())
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
.build();
}
}
1.4 编写上传代码
@Service
public class FileServiceImpl implements FileService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioProperties minioProperties;
@Override
public String uploadFile(MultipartFile file) throws ServerException, InsufficientDataException,
ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException,
InvalidResponseException, XmlParserException, InternalException {
// 判断bucket是否存在
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder()
.bucket(minioProperties.getBucketName())
.build());
if (!bucketExists) {
//创建bucket
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(minioProperties.getBucketName())
.build());
}
// 设置bucket权限(自己读写,所有人读)
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
.bucket(minioProperties.getBucketName())
.config(this.createBucketPolicyConfig(minioProperties.getBucketName()))
.build());
// 上传文件
String fileName = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
+ "/" + UUID.randomUUID() + file.getOriginalFilename();
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioProperties.getBucketName())
.stream(file.getInputStream(), file.getSize(), -1)
.object(fileName)
.contentType(file.getContentType())
.build());
// String url = minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/" + fileName;
// String.join(delimiter, elements) delimiter: 分隔符 elements: 可变长度元素
return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), fileName);
}
// minio bucket权限
private String createBucketPolicyConfig(String bucketName) {
return """
{
"Statement" : [{
"Action" : "s3:GetObject",
"Effect" : "Allow",
"Principal" : "*",
"Resource" : "arn:aws:s3:::%s/*"
}],
"Version" : "2012-10-17"
}
""".formatted(bucketName);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报