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_USERMINIO_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);
    }
}
posted @   xyzZero3  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示