CentOS环境下Minio的安装,并实现文件的上传

一、CentOS环境下安装Minio

CentOS环境下安装Minio的方式有多种,下面将依次介绍常规安装方式及docker安装方式。

常规安装方式

1.创建Minio安装目录,并在线下载Minio

mkdir -p /usr/local/minio/data #创建minio安装目录
cd /usr/local/minio

yum -y install wget
wget https://dl.min.io/server/minio/release/linux-amd64/minio #使用wget下载minio
chmod +x minio  #修改权限

2.开放Minio访问端口号

firewall-cmd --zone=public  --add-port=9000/tcp --permanent
firewall-cmd  --zone=public  --add-port=9001/tcp --permanent
firewall-cmd --reload

3.使用vim start-minio.sh 命令创建可运行Minio的Shell脚本,切换到start-minio.sh文件所在目录,并使用./start-minio.sh命令运行执行脚本,使用tailf minio.log 命令可查看Minio的运行状况。start-minio.sh文件内容如下所示。

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
nohup /usr/local/minio/minio server --address ':9000' --console-address ':9001'   /usr/local/minio/data > /usr/local/minio/minio.log 2>&1 &

基于docker的安装方式

1.查看docker环境是否正常

docker search minIO

2.拉取Minio镜像

docker pull minio/minio

3.查看镜像

docker images

4.创建Minio容器

docker run -d -p 9000:9000 --name minio \
-p 9001:9001 \
-e 'MINIO_ACCESS_KEY=minioadmin' \
-e 'MINIO_SECRET_KEY=minioadmin' \
-v /usr/share/minio/data:/data \
-v /usr/share/minio/config:/root/.minio \
minio/minio server /data \
--address ':9000' --console-address ':9001'

5.查看日志

 docker logs -f minio
二、使用Minio实现文件上传

1.添加Maven依赖

<dependency>
  <groupId>io.minio</groupId>
  <artifactId>minio</artifactId>
  <version>8.2.1</version>
</dependency>

2.添加application.yml配置

# Miniio配置
minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  secure: false
  bucketName: "miniodemo"

3.Minio配置类

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private final static String HTTP = "http://";

    //endPoint是一个URL,域名,IPv4或者IPv6地址
    private String endpoint;

    //TCP/IP端口号
    private int port;

    //accessKey类似于用户ID,用于唯一标识你的账户
    private String accessKey;

    //secretKey是你账户的密码
    private String secretKey;

    //如果是true,则用的是https而不是http,默认值是true
    private Boolean secure;

    //默认存储桶
    private String bucketName;

   @Bean
    public MinioClient getClient() {
        MinioClient minioClient =
                MinioClient.builder()
                        .endpoint("http://" + endpoint + ":" + port)
                        .credentials(accessKey, secretKey)
                        .build();
        return minioClient;
    }
}

4.文件上传

@RestController
@RequestMapping("file")
@Slf4j
public class UploadFileController {
    @Autowired
    private MinioConfig minioConfig;

    @Resource
    private MinioClient minioClient;

    @PostMapping("upload")
    public void uploadFile(@RequestParam(value = "file") MultipartFile file) {
        String fileName = file.getOriginalFilename();
        if (fileName == null) {
            throw new RuntimeException();
        }
        InputStream inputStream = null;
        String bucketName = minioConfig.getBucketName();

        try {
            if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
                minioClient
                    .makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName).build());
            }

            String datePath = LocalDate.now()
                .format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String extension = FilenameUtils.getExtension(fileName);
            fileName = datePath + "/" + uuid + "." + extension;
            String objectName = "/" + bucketName + "/" + fileName;
            inputStream = file.getInputStream();
            minioClient.putObject(
                             PutObjectArgs.builder()
                            .bucket(bucketName)
                            .contentType(file.getContentType())
                            .object(fileName)
                            .stream(inputStream,inputStream.available(), -1)
                            .build());
        String url = minioClient
                    .getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.PUT)
                    .bucket(bucketName)
                    .object(fileName)
                    .expiry(1, TimeUnit.DAYS)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.debug("inputStream close IOException:" + e.getMessage());
                }
            }
        }

    }

}