Heim >Java >javaLernprogramm >Wie SpringBoot Minio zur Dateispeicherung verwendet

Wie SpringBoot Minio zur Dateispeicherung verwendet

WBOY
WBOYnach vorne
2023-05-11 12:16:051683Durchsuche

1. minio

MinIO ist eine leistungsstarke Objektspeicherlösung, die die Bereitstellung von Kubernetes nativ unterstützt. MinIO bietet eine Amazon Web Services S3-kompatible API und unterstützt alle Kernfunktionen von S3. MinIO 是一个高性能的对象存储原生支持 Kubernetes 部署的解决方案。 MinIO 提供了一个 Amazon Web Services S3 兼容 API 并支持所有核心 S3 功能。

MinIO 对象存储使用 buckets 来组织对象。 存储桶类似于文件系统中的文件夹或目录,其中每个 桶可以容纳任意数量的对象。 MinIO 存储桶提供 与 AWS S3 存储桶相同的功能。

其中 MinIO 的优势有:

高性能:

MinIO是全球领先的对象存储先锋,在标准硬件上,读/写速度上高达183 GB / 秒171 GB / 秒

可扩展性:

MinIO利用了web缩放器的来之不易的知识,为对象存储带来了简单的存储缩放模型, 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。 通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。

云原生支持:

MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。 其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

源码开放与企业级支持:

MinIO 基于Apache V2 license 100% 开放源代码 。 这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。 此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。

在实验开始前请确保安装完成了 minio

Wie SpringBoot Minio zur Dateispeicherung verwendet

二、SpringBoot 使用 Minio 进行文件存储

首先新建一个 SpringBoot 项目,在 pom 中引入 minio 依赖:

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

在配置文件中,声明出 minio 的信息:

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

下面创建一个配置类,对 MinioClient 进行创建:

@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;
    }
}

下面创建一个工具类 MinioTool 将常用的操作封装在工具类中:

@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();
    }

}

编写测试接口,进行测试:

@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();
    }

}

三、测试

测试上传文件:

Wie SpringBoot Minio zur Dateispeicherung verwendet

如果使用 返回的 url 直接访问文件,可以发现返回权限不足:

Wie SpringBoot Minio zur Dateispeicherung verwendet

这里需要改一下 BucketAccess Policy ,默认为 private,可以修改为 public 便无需认证,但安全性无法保证:

Wie SpringBoot Minio zur Dateispeicherung verwendet

Wie SpringBoot Minio zur Dateispeicherung verwendet

Wie SpringBoot Minio zur Dateispeicherung verwendet

再次进行访问,文件就可以打开了:

Wie SpringBoot Minio zur Dateispeicherung verwendet

如果需要保持 private ,可以通过 MinioClient 进行下载,使用 download 测试接口下载文件:http://localhost:8080/file/download/20cab4e3979eba6003f95aca0dc75c63.jpg

MinIO Objektspeicher verwendet Buckets, um Objekte zu organisieren. Buckets ähneln Ordnern oder Verzeichnissen in einem Dateisystem, wobei jeder Bucket eine beliebige Anzahl von Objekten enthalten kann. Der MinIO-Bucket bietet die gleiche Funktionalität wie der AWS S3-Bucket.

Wie SpringBoot Minio zur Dateispeicherung verwendetDie Vorteile von MinIO sind:

🎜Hohe Leistung: 🎜🎜MinIO ist der weltweit führende Objektspeicherpionier auf Standardhardware, Read /Schreibgeschwindigkeiten bis zu 183 GB/s und 171 GB/s. 🎜🎜Skalierbarkeit:🎜🎜MinIO nutzt das hart erarbeitete Wissen des web-Skalierers, um das Objektspeicher-Speicherskalierungsmodell in MinIO beginnt die Skalierung bei einem einzelnen Cluster, der mit anderen MinIO-Clustern zusammengeschlossen werden kann, um einen globalen Namespace zu erstellen, und sich bei Bedarf über mehrere verschiedene Cluster von Rechenzentren erstrecken kann. Der Namespace kann durch Hinzufügen weiterer Cluster und Racks erweitert werden, bis das Ziel erreicht ist. 🎜🎜Cloud-native-Unterstützung:🎜🎜MinIO ist eine Software, die in den letzten 4 Jahren von Grund auf neu entwickelt wurde, der Architektur und dem Konstruktionsprozess des gesamten nativen Cloud-Computing entspricht und enthält die neuesten Cloud-Computing-Technologien und -Konzepte. Dazu gehört Container-Technologie, die Kubernetes, Microservices und Mandantenfähigkeit unterstützt. Machen Sie die Objektspeicherung benutzerfreundlicher für Kubernetes. 🎜🎜Open-Source- und Enterprise-Level-Unterstützung:🎜🎜MinIO basiert auf Apache V2-Lizenz 100 % Open Source. Das bedeutet, dass Kunden von MinIO automatisch, uneingeschränkt und frei MinIO nutzen und integrieren, neue Versionen und Software frei entwickeln und frei verbreiten können. MinIO hat viele Fortune-500-Unternehmen stark unterstützt und vorangetrieben. Darüber hinaus bieten die Vielfalt und Professionalität des Einsatzes Vorteile, die andere Software nicht bieten kann. 🎜🎜Bitte stellen Sie sicher, dass die Installation von minio abgeschlossen ist, bevor Sie mit dem Experiment beginnen: 🎜🎜Wie verwendet SpringBoot Minio für die Dateispeicherung🎜🎜2. SpringBoot verwendet Minio für die Dateispeicherung🎜🎜Erstellen Sie zunächst ein neues SpringBoot-Projekt und führen Sie es in ein pom minio hängt ab von: 🎜rrreee🎜Deklarieren Sie in der Konfigurationsdatei die Informationen von minio: 🎜rrreee🎜Erstellen Sie unten eine Konfigurationsklasse, um auszuführen MinioClient Erstellen: 🎜rrreee🎜 Erstellen Sie unten eine Werkzeugklasse MinioTool und kapseln Sie allgemeine Operationen in der Werkzeugklasse: 🎜rrreee🎜Schreiben Sie eine Testschnittstelle und testen Sie sie: 🎜rrreee🎜 3. Testen 🎜 🎜Test-Upload-Dateien: 🎜🎜Wie verwendet SpringBoot Minio für die Dateispeicherung 🎜🎜Wenn Sie die zurückgegebene URL verwenden, um direkt auf die Datei zuzugreifen, können Sie feststellen, dass die Rückgabeberechtigung nicht ausreicht: 🎜🎜So verwenden Sie Minio für SpringBoot-Dateispeicherung🎜🎜Hier müssen Sie die Zugriffsrichtlinie von Bucket ändern. Der Standardwert ist private, der in public geändert werden kann. Es ist keine Authentifizierung erforderlich, aber die Sicherheit kann nicht garantiert werden: 🎜🎜So verwenden Sie Minio mit SpringBoot-Dateispeicherung🎜🎜Wie verwendet SpringBoot Minio für die Dateispeicherung 🎜🎜Wie verwendet SpringBoot Minio für die Dateispeicherung🎜🎜Besuchen Sie es erneut. Die Datei kann geöffnet werden: 🎜🎜Wie verwendet SpringBoot Minio für die Dateispeicherung 🎜🎜Wenn Sie privat halten müssen, können Sie den Download über MinioClientdurchführen > und verwenden Sie die Testschnittstelle download, um die Datei herunterzuladen: http://localhost:8080/file/download/20cab4e3979eba6003f95aca0dc75c63.jpg🎜🎜🎜🎜

Das obige ist der detaillierte Inhalt vonWie SpringBoot Minio zur Dateispeicherung verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen