Java整合MinIO实现文件管理

这篇具有很好参考价值的文章主要介绍了Java整合MinIO实现文件管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MinIo

MinIO基于Apache License 2.0开源协议的对象存储服务。它兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。

MinIo基础概念

  • Object:存储到Minio的基本对象,如文件字节流,Anything
  • Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
  • Drive:即存储数据的磁盘,在MiniO启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive里
  • Set:即-组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同位置。一个对象存
    储在一个Set上。一个对象存储在一个Set上,一个集群划分为多个Set,一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
    一个Set中的Drive尽可能分布在不同的节点上。

docker运行

本次直接基于Docker来运行MinIo

拉取镜像

 docker pull minio/minio

运行镜像

docker run --privileged -d -it -p 9000:9000 -p 9111:9111
--name minio -e "MINIO_ROOT_USER=minioadmin" --privileged=true
-e "MINIO_ROOT_PASSWORD=minio@123456"
-v /Users/wangyupeng/data/minio/data:/data
-v /Users/wangyupeng/data/minio/config:/root/.minio minio/minio server /data
--console-address ":9111" -address ":9000"
  • 运行命令,重要参数说明

1、--privileged

container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。

2、MINIO_ROOT_USER

登陆管理界面的用户名

3、MINIO_ROOT_PASSWORD

登陆管理页面密码

4、-V

第一个-v 是设置数据存放目录,第二个-v是配置目录

5、--console-address

管理界面 端口设置,一定要和其中一个-p参数的端口对上,不指定的话会随机分配端口

6、-address

api访问端口

7、--name

容器运行的名字

查看运行日志

docker logs minio
  • 出现下面的日志,表示容器运行成功
    minio java,java,docker,容器

访问minio

浏览器输入http://127.0.0.1:9111,输入设置的MINIO_ROOT_USERMINIO_ROOT_PASSWORD就能登录了,到此我们已经将minio运行起来了。

minio java,java,docker,容器

SpringBoot整合MinIO

引入依赖

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

配置

server:
  port: 9999

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  minio:
    access-key: minioadmin      #key就是docker初始化是设置的,密钥相同
    secret-key: minio@123456
    url: http://localhost:9000
    bucket-name: admin   # 登陆minio创建的文件桶

构建配置类

package org.triumphxx.minio.config;

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author:triumphxx
 * @Date:2023/5/28
 * @Time:20:54
 * @微信公众号:北漂码农有话说
 * @网站:https://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: minio配置类
 **/
@Configuration
@ConfigurationProperties(prefix = "spring.minio")
@Data
public class MinioConfiguration {
    /**
     * 用户名
     */
    private String accessKey;
    /**
     * 密码
     */
    private String secretKey;
    /**
     * Minio 服务端 api地址
     */
    private String url;
    /**
     * 存储桶名字
     */
    private String bucketName;

    /**
     * 构建 操作Minio的客户端
     * @return
     */
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(url)
                .credentials(accessKey, secretKey)
                .build();
    }

}

构建操作minio的服务类

package org.triumphxx.minio.service;

import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.PostPolicy;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.triumphxx.minio.config.MinioConfiguration;
import io.minio.http.Method;

import java.io.InputStream;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author:triumphxx
 * @Date:2023/5/28
 * @Time:20:59
 * @微信公众号:北漂码农有话说
 * @网站:https://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: 操作minio的服务
 **/
@Service
@Slf4j
public class MinIoService {
    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfiguration configuration;


    /**
     * 获取上传文件临时签名,作用是:前端获取到签名信息后可以直接将文件上传到minio
     * @param fileName
     * @param time
     * @return
     */
    public Map getPolicyUrl(String fileName, ZonedDateTime time) {
        PostPolicy postPolicy = new PostPolicy(configuration.getBucketName(), time);
        postPolicy.addEqualsCondition("key", fileName);
        try {
            Map<String, String> map = minioClient.getPresignedPostFormData(postPolicy);
            HashMap<String, String> policyMap = new HashMap<>();
            map.forEach((k,v)->{
                policyMap.put(k.replaceAll("-",""),v);
            });
            policyMap.put("host",configuration.getUrl()+"/"+configuration.getBucketName());
            return policyMap;
        }  catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *
     * @param objectName
     * @param time
     * @param timeUnit
     * @return
     */
    public String getFileUrl(String objectName,int time, TimeUnit timeUnit) {
        try {
            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(configuration.getBucketName())
                    .object(objectName)
                    .expiry(time, timeUnit).build());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 针对前端直接上传的是文件的格式
     * @param file 文件
     */
    public void uploadToFile(MultipartFile file) {
        // 使用putObject上传一个文件到存储桶中。
        try {
            InputStream inputStream = file.getInputStream();
            String fileName = file.getOriginalFilename();
            log.info("上传的文件名为:{}",fileName);
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(configuration.getBucketName())
                    .object(fileName.substring(0,fileName.indexOf(".")))
                    .stream(inputStream, file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build());
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 根据文件名访问指定有效期的文件访问链接
     * @param objectName
     * @param time
     * @param timeUnit
     * @return
     */
    public String getUrl(String objectName, int time, TimeUnit timeUnit) {
        String url = null;
        try {
            url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(configuration.getBucketName())
                    .object(objectName)
                    .expiry(time, timeUnit).build());
        }catch (Exception e){
            e.printStackTrace();
        }
        return url;
    }
}

创建测试类

package org.triumphxx.minio.controller;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.triumphxx.minio.service.MinIoService;

import javax.annotation.Resource;
import java.time.ZonedDateTime;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author:triumphxx
 * @Date:2023/5/28
 * @Time:20:58
 * @微信公众号:北漂码农有话说
 * @网站:https://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: 文件上传
 **/
@RestController
public class MinIoController {
    @Resource
    MinIoService minIoService;

    /**
     * 针对于前端的直接上传文件格式的接口
     * @param file
     */
    @PostMapping("/upload")
    public void uploadToFile(@RequestParam("file") MultipartFile file){
        minIoService.uploadToFile(file);
    }
    /**
     * 针对于后端文件流的形式上传文件
     * @param file
     */
    @PostMapping("/uploadToFileInputStream")
    public void uploadToFileInputStream(@RequestParam("file") MultipartFile file){
        minIoService.uploadToFile(file);
    }
    /**
     * 获取 一定有效期的图片连接
     * @param name 文件名称
     * @param time 时间 单位:天
     * @return
     */
    @GetMapping("/getFileUrl")
    public String getFileUrl(@RequestParam("name") String name , @RequestParam("time") int time){
       return minIoService.getUrl(name,time, TimeUnit.DAYS);
    }

    /**
     * 获取 文件签名
     * @param name 文件名称
     * @return
     */
    @PostMapping("/getPolicyUrl")
    public Map getPolicyUrl(@RequestParam("name") String name){
        return minIoService.getPolicyUrl(name, ZonedDateTime.now());
    }

    /**
     * 获取 临时文件连接
     * @param name 文件名称
     * @return
     */
    @PostMapping("/getTempFileUrl")
    public String getTempFileUrl(@RequestParam("name") String name, @RequestParam("time") int time){
        return minIoService.getFileUrl(name, time,TimeUnit.DAYS);
    }
}

使用postman测试

minio java,java,docker,容器

查看上传的图片

看到如下图片表示上传成功!
minio java,java,docker,容器

小结

本篇文章,一起探讨了使用docker运行minio,并且使用springboot整合,实现文件的上传。 源码地址源码传送门文章来源地址https://www.toymoban.com/news/detail-713610.html

到了这里,关于Java整合MinIO实现文件管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java调用Elasticsearch API实现全文检索,搭配MinIO文件存储

    应用背景: 对存储在MinIO服务器的文件实现全文检索。也可以是其他服务器或本地文件,本文仅详细介绍MinIO文件的读取及转换。通过Elasticsearch的Ingest-Attachment插件抽取文件内容,支持Word、Excel、PDF、TXT等格式文件,无需手动解析文件内容。 上代码,详细解释可以阅读注释、

    2024年02月11日
    浏览(42)
  • springboot整合Minio + vue 实现文件分片上传(完整代码)

    网上关于minio分片上传的资料不太详细,缺斤少两,所以我基于他们的代码做了一些修改,demo能够正常运行起来,但是偶尔也会发生一些小bug,不过这些都无伤大雅,最终目的是理解代码背后的逻辑和流程 流程: 前端获取生成文件MD5,发送至后台判断是否有该文件缓存,有

    2024年02月02日
    浏览(53)
  • Java 上传文件到MinIO服务器上

    一、MinIO配置 主界面: 2.创建桶的文件路径 你可以设置任意想要配置的路径  3.管理桶权限 这里Prefix写 * 是为了匹配所有请求路径 Access: readonly就可以通过url访问图片了。 二、SpringBoot Maven项目: 导入坐标:  三、配置application.yml文件 四、编写读取配置类 五、创建工具类 六

    2024年02月08日
    浏览(46)
  • Java大文件分片上传(minio版),超详细

    本文使用spring boot 结合minio文件服务做的大文件分片上传,思路:①:初始化文件调用后端接口,后端再调用minio把文件分片成几份,生成每个分片的minio上传url②:把提起分片好的文件依次调用上一把返回的url ③:调用合并分片文件接口,完成上传 PS:文件并未经过后端服务

    2024年02月07日
    浏览(47)
  • java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案

    用户上传文件到Minio时,一般存储在Minio中的对象名称都是后端以UUID或者其他随机或非随机方案生成的唯一标识做为文件名,这个对象名称一般都不会是用户上传时的原文件名称。 在用户下载时,想让文件流不通过后端服务器,而是用户直接申请并使用某个要下载对象的Min

    2024年01月25日
    浏览(56)
  • 如何在本地Docker中部署MinIO服务并实现远程访问管理界面

    MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼容Amazon S3 API,因此可以与现有的S3工具和库无缝集成。MinIO的设计目标是高性能、高可用性和可扩展性。它可以在分布式模式下运行,以满足不同规模的存储需求。 MinIO是

    2024年02月04日
    浏览(43)
  • 基于Docker MinIO整合Nginx搭建反向代理

    docker拉去镜像安装和配置就不说了 主要说一下配置反向代理 第一次使用minio我陷入了一个误区,将nginx的data目录挂载到了minio的文件目录,这样是可以通过nginx访问minio文件,但是没有任何意义,也没有做任何的代理设置,研究了很久最后把nginx容器停了重新run一个,然后配置

    2024年02月09日
    浏览(40)
  • minio + linux + docker + spring boot实现文件上传与下载

    检查linux内核,必须是3.10以上 安装docker 启动docker 搜索镜像 拉取镜像 启动minio -p: 指定端口映射,格式为:主机端口:容器端口 (这里注意要映射两个,否则API会访问不到) -e “MINIO_ROOT_USER=vinci” minio用户名; -e MINIO_SECRET_KEY=123456 minio 密码 -d: 后台运行容器,并返回容器ID; -

    2024年02月07日
    浏览(56)
  • 上传视频文件,基于断点续传(整合Minio)

    目录 1、什么是断点续传 2、分块文件 3、合并文件 4、 Minio 分布式文件系统整合断点续传 4.1 进行文件分块上传到 Minio  4.2 进行 Minio 中分块文件的合并 5、使用 Minio 进行断点续传的注意事项           相信很多小伙伴在上传下载图片或者视频的时候,突然间(没错就是这

    2024年02月11日
    浏览(46)
  • Springboot整合minio组件-分布式文件存储

    一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。 Minio主要用来存储非结构化的数据,类似文件,图片,照片,日志文件,各类备份文件等,按照官网描述,文件的大小从几KB到5TB。 Minio提

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包