Rumah  >  Artikel  >  Java  >  Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail

WBOY
WBOYke hadapan
2023-05-11 12:16:051671semak imbas

1. minio

MinIO ialah penyelesaian storan objek berprestasi tinggi yang menyokong penggunaan Kubernetes secara asli. MinIO menyediakan Amazon Web Services S3 yang serasi dengan API dan menyokong semua fungsi S3 teras.

MinIO Storan objek menggunakan buckets untuk menyusun objek. Baldi adalah serupa dengan folder atau direktori dalam sistem fail, di mana setiap baldi boleh memuatkan sebarang bilangan objek. Baldi MinIO menyediakan fungsi yang sama seperti baldi AWS S3.

Kelebihan MinIO ialah:

Prestasi tinggi:

MinIO ialah perintis storan objek terkemuka di dunia, berdasarkan perkakasan standard , kelajuan baca/tulis setinggi 183 GB / 秒 dan 171 GB / 秒.

Kebolehskalaan:

MinIO memanfaatkan pengetahuan susah payah web skalar untuk membawa model penskalaan storan ringkas ke storan objek , dalam MinIO , penskalaan bermula dengan gugusan tunggal yang boleh digabungkan dengan gugusan MinIO lain untuk mencipta ruang nama global dan merentangi berbilang pusat data yang berbeza jika perlu. Ruang nama boleh dikembangkan dengan menambahkan lebih banyak kelompok, lebih banyak rak, sehingga matlamat dicapai.

Sokongan asli awan:

MinIO Ia adalah perisian yang dibina dari awal dalam 4 tahun yang lalu dan mematuhi semua seni bina pengkomputeran awan asli dan Proses pembinaan termasuk teknologi dan konsep baharu pengkomputeran awan terkini. Ini termasuk teknologi kontena yang menyokong Kubernetes, perkhidmatan mikro dan penyewaan berbilang. Jadikan storan objek lebih Kubernetes mesra.

Sumber terbuka dan sokongan peringkat perusahaan:

MinIO Berdasarkan Apache V2 license 100% kod sumber terbuka. Ini bermakna bahawa pelanggan MinIO boleh secara automatik, tanpa had dan bebas menggunakan dan menyepadukan MinIO, bebas berinovasi dan mencipta, bebas mengubah suai, dan bebas mengeluarkan semula versi dan perisian baharu, MinIO Sangat menyokong dan memacu banyak Fortune 500 syarikat. Di samping itu, kepelbagaian dan profesionalisme penggunaannya memberikan kelebihan yang tidak dapat dipadankan oleh perisian lain.

Sila pastikan pemasangan selesai sebelum memulakan percubaan minio:

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail

2 Mula-mula buat yang baharu Untuk projek

, perkenalkan

kebergantungan dalam SpringBoot: pom

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.1</version>
</dependency>
minio Dalam fail konfigurasi, isytiharkan maklumat

:

minio:
  url: http://192.168.40.169:9000   # minio配置的地址,端口9000,注意不是控制台的端口
  accessKey: minioadmin   # 账号
  secretKey: minioadmin   # 密码
  bucketName: test-bucket  # MinIO桶名字
minio Cipta kelas konfigurasi di bawah, Cipta

:

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
    /**
     * 服务地址
     */
    private String url;
 
    /**
     * 用户名
     */
    private String accessKey;
 
    /**
     * 密码
     */
    private String secretKey;
 
    /**
     * 存储桶名称
     */
    private String bucketName;

    @Bean
    public MinioClient getMinioClient() throws Exception {
        MinioClient minioClient = MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
        //判断桶是否存在,不存在则新建
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        }
        return minioClient;
    }
}
MinioClientBuat kelas alat

untuk merangkum operasi biasa dalam kelas alat:

@Component
public class MinioTool {
    
    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minioConfig;
 
    /**
     * 查看存储bucket是否存在
     *
     * @param bucketName 存储bucket
     * @return boolean
     */
    public Boolean bucketExists(String bucketName) {
        Boolean found;
        try {
            found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return found;
    }
 
    /**
     * 创建存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 删除存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 查看文件对象
     *
     * @param bucketName 存储bucket名称
     * @return 存储bucket内文件对象信息
     */
    public Iterable<Result<Item>> listObjects(String bucketName) {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).build());
        return results;
    }

    /**
     * 批量删除文件对象
     *
     * @param bucketName 存储bucket名称
     * @param objects    对象名称集合
     */
    public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
        List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
        return results;
    }


    /**
     * 文件上传
     * 文件名称相同会覆盖
     * @param file       文件
     * @return Boolean
     */
    public Boolean upload(MultipartFile file, String fileName) {
        try {
            if (!bucketExists(minioConfig.getBucketName())) {
                makeBucket(minioConfig.getBucketName());
            }
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName)
                    .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 文件下载
     *
     * @param fileName   文件名称
     * @param res        response
     * @return Boolean
     */
    public void download(String fileName, HttpServletResponse res) {
        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName())
                .object(fileName).build();
        try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
            byte[] buf = new byte[1024];
            int len;
            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
                while ((len = response.read(buf)) != -1) {
                    os.write(buf, 0, len);
                }
                os.flush();
                byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");
                //设置强制下载不打开
                res.setContentType("application/force-download");
                res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                try (ServletOutputStream stream = res.getOutputStream()) {
                    stream.write(bytes);
                    stream.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getFileUrl(String fileName){
        return StringFormatter.concat(minioConfig.getUrl(), "/", minioConfig.getBucketName(), "/", fileName).getValue();
    }

}
MinioToolTulis antara muka ujian untuk ujian:

@Component
public class MinioTool {
    
    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minioConfig;
 
    /**
     * 查看存储bucket是否存在
     *
     * @param bucketName 存储bucket
     * @return boolean
     */
    public Boolean bucketExists(String bucketName) {
        Boolean found;
        try {
            found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return found;
    }
 
    /**
     * 创建存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 删除存储bucket
     *
     * @param bucketName 存储bucket名称
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 查看文件对象
     *
     * @param bucketName 存储bucket名称
     * @return 存储bucket内文件对象信息
     */
    public Iterable<Result<Item>> listObjects(String bucketName) {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).build());
        return results;
    }

    /**
     * 批量删除文件对象
     *
     * @param bucketName 存储bucket名称
     * @param objects    对象名称集合
     */
    public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
        List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
        return results;
    }


    /**
     * 文件上传
     * 文件名称相同会覆盖
     * @param file       文件
     * @return Boolean
     */
    public Boolean upload(MultipartFile file, String fileName) {
        try {
            if (!bucketExists(minioConfig.getBucketName())) {
                makeBucket(minioConfig.getBucketName());
            }
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName)
                    .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 文件下载
     *
     * @param fileName   文件名称
     * @param res        response
     * @return Boolean
     */
    public void download(String fileName, HttpServletResponse res) {
        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName())
                .object(fileName).build();
        try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
            byte[] buf = new byte[1024];
            int len;
            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
                while ((len = response.read(buf)) != -1) {
                    os.write(buf, 0, len);
                }
                os.flush();
                byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");
                //设置强制下载不打开
                res.setContentType("application/force-download");
                res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                try (ServletOutputStream stream = res.getOutputStream()) {
                    stream.write(bytes);
                    stream.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getFileUrl(String fileName){
        return StringFormatter.concat(minioConfig.getUrl(), "/", minioConfig.getBucketName(), "/", fileName).getValue();
    }

}

3. Uji

Uji fail yang dimuat naik:

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan failJika anda menggunakan url yang dikembalikan untuk mengakses fail secara terus, anda boleh mendapati bahawa pulangan kebenaran tidak mencukupi:

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan failDi sini anda perlu menukar

lalai ialah Bucket dan boleh ditukar kepada Access Policy tanpa pengesahan, tetapi keselamatan tidak boleh dijamin: privatepublic

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan failAkses sekali lagi dan fail boleh dibuka:

Bagaimana SpringBoot menggunakan Minio untuk penyimpanan failJika anda perlu menyimpan

, anda boleh memuat turunnya melalui

dan menggunakan antara muka ujian private untuk memuat turun fail: MinioClientdownloadhttp://localhost:8080/file/download/20cab4e3979eba6003f95aca0dc75c63.jpg

Atas ialah kandungan terperinci Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam