使用minio进行文件存储

发布时间 2023-05-26 17:41:28作者: 花花_新世界

一. Docker拉取镜像(确保自己的服务器已经安装Docker)

docker pull minio/minio

二. 启动一个miniio容器

docker run --name minio -p 9090:9000 -p 9999:9999 -d \
--restart=always -e \
"MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio minio/minio server /data --console-address '0.0.0.0:9999'

账号是minio; 密码是minio123

三. 访问minio管理界面

端口9090或9999(确保在服务器放行相关端口即可访问)

 

点击 create a Bucket 创建一个bucket(桶), 这里的Bucket 我们可以理解为文件存储的目录

输入 bucket name ,点击create bucket 。可以通过 upload 上传文件到bucket中。

四. Java 上传文件到minio

  1. 导入依赖

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

        2.测试类(需要输入自己的账号密码和IP)

import io.minio.MinioClient;
import io.minio.ObjectWriteResponse;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author lqs
 * @date 2022/11/18 9:53
 */
public class MinioTest {
    public static void main(String[] args) throws Exception {
        try {

            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                    //创建容器时指定的账号
                    .credentials("账号", "密码")
                    //上传地址
                    .endpoint("http://IP:9090").build();

            File file = new File("C:\\Users\\coderyeah\\Desktop\\welt.jpg");

            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object("welt.jpg")    //文件名
                    .contentType("image/jpeg")    //文件类型
                    .bucket("bucket-test")  //存储目录名
                    .stream(new FileInputStream(file), file.length(), -1).build(); //文件流,以及大小,-1代表不分片

            //执行上传
            ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs);
            System.out.println("上传结果 " + objectWriteResponse);
            //上传之后的文件地址是:
            String filePath = "http://IP:9090/bucket-test/welt.jpg";
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }
}
package com.test.FileUploadUtils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;


/**
 * 文件上传到minio服务器
 *
 * @author doubleflower
 * @date 2023-05-25
 */
@Service
@Slf4j
public class FileUploadUtils {

    @Resource
    private Sms2Config sms2Config;

    @Value("${sign.key}")
    private String signKey;

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.port}")
    private String port;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.bucketName}")
    private String bucketName;


    /**
     * 文件上传
     *
     * @param multipartFile
     * @return
     */
    @Override
    public String upload(MultipartFile multipartFile) throws IOException {
        String fileUrl = null;
        InputStream inputStream = null;
        File file = null;
        try {
            // 创建临时文件
            file = File.createTempFile("temp", null);
            // 把multipartFile写入临时文件
            multipartFile.transferTo(file);
            // 使用文件创建 inputStream 流
            inputStream = new FileInputStream(file);
            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                    //创建容器时指定的账号
                    .credentials(accessKey, secretKey)
                    //上传地址
                    .endpoint(endpoint + ":" + port).build();
            String fileName = multipartFile.getOriginalFilename();
            String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
// 获取文件类型
String contentType=multipartFile.getContentType(); PutObjectArgs putObjectArgs
= PutObjectArgs.builder() .object(objectName) .contentType(contentType) .bucket(bucketName) .stream(inputStream, file.length(), -1).build(); //执行上传 minioClient.putObject(putObjectArgs); //上传之后的文件地址是: fileUrl = endpoint + ":" + port + "/" + bucketName + "/" + objectName; } catch (MinioException e) { System.out.println("Error occurred: " + e); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } finally { // 最后记得删除文件 file.deleteOnExit(); // 关闭流 inputStream.close(); } return fileUrl; } }

五. 配置权限

如果我们需要我们上传的文件可以被匿名用户访问,那么需要添加访问权限:找到文件存储目录,点击manager

 然后找到access Rules添加访问规则如下:

 然后再访问路径:http://IP:PORT/bucket-test/welt.jpg