SpringBoot+MINIO

  1. Linux安装MINIO
    https://blog.csdn.net/tongxin_tongmeng/article/details/133934115
  2. MINIO创建桶


  3. MINIO创建秘钥



  4. MINIO的API路径
    http://your-server-ip:9000
    注意:API路径在日志文件中/opt/minio/minio.log
  5. pom.xml
    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
    <dependency>
    	<groupId>com.amazonaws</groupId>
    	<artifactId>aws-java-sdk-s3</artifactId>
    	<version>1.12.566</version>
    </dependency>
  6. application.yml
    aws:
      s3:
        accessKey: minio_access_key
        secretKey: minio_secret_key
        url: http://your-server-ip:9000
        bucket: minio-bucket
    
    spring:
      servlet:
        multipart:
          max-file-size: 100MB
          max-request-size: 100MB
  7. 配置类
    @Data
    @Configuration
    @ConfigurationProperties(prefix = "aws.s3")
    public class AwzS3Config {
        private String accessKey;
        private String secretKey;
        private String url;
        private String bucket;
    }
  8. 工具类

    @Component
    public class AwzS3Util {
    
        @Resource
        private AwzS3Config injectAwzS3Config;
    
        private static AwzS3Config awzS3Config;
    
        private static AmazonS3 amazonS3;
    
    
        @PostConstruct
        public void init() {
            awzS3Config = this.injectAwzS3Config;
            AWSCredentials credentials = new BasicAWSCredentials(awzS3Config.getAccessKey(), awzS3Config.getSecretKey());
            AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
            AwsClientBuilder.EndpointConfiguration endpointConfig =
                    new AwsClientBuilder.EndpointConfiguration(awzS3Config.getUrl(), Regions.CN_NORTH_1.getName());
            ClientConfiguration config = new ClientConfiguration();
            config.setSignerOverride("S3SignerType");
            config.setProtocol(Protocol.HTTP);
            config.withUseExpectContinue(false);
            config.disableSocketProxy();
            amazonS3 = AmazonS3Client.builder()
                    .withEndpointConfiguration(endpointConfig)
                    .withClientConfiguration(config)
                    .withCredentials(credentialsProvider)
                    .disableChunkedEncoding()
                    .withPathStyleAccessEnabled(true)
                    .withForceGlobalBucketAccessEnabled(true)
                    .build();
        }
    
    
        public static boolean createBucket(String bucket) {
            if (StringUtils.isNullOrEmpty(bucket)) {
                throw new IllegalArgumentException("桶名称不能为空!");
            }
            try {
                amazonS3.createBucket(bucket);
            } catch (SdkClientException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        public static boolean deleteBucket(String bucket) {
            if (StringUtils.isNullOrEmpty(bucket)) {
                throw new IllegalArgumentException("桶名称不能为空!");
            }
            try {
                amazonS3.deleteBucket(bucket);
            } catch (SdkClientException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        public static boolean upload(MultipartFile file, String bucket) {
            if (Objects.isNull(file)) {
                throw new IllegalArgumentException("文件不能为空!");
            }
            String fileName = file.getOriginalFilename();
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentType(file.getContentType());
            objectMetadata.setContentLength(file.getSize());
            bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;
            try {
                PutObjectRequest request = new PutObjectRequest(bucket, fileName, file.getInputStream(), objectMetadata)
                        // 设置文件访问权限
                        .withCannedAcl(CannedAccessControlList.BucketOwnerFullControl);
                PutObjectResult result = amazonS3.putObject(request);
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        public static ResponseEntity<byte[]>    downloadByName(String bucket, String fileName) throws IOException {
            if (StringUtils.isNullOrEmpty(bucket)) {
                throw new IllegalArgumentException("文件名称不能为空!");
            }
            bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;
            GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, fileName);
            S3Object s3Object = amazonS3.getObject(getObjectRequest);
            S3ObjectInputStream objectInputStream = s3Object.getObjectContent();
            byte[] bytes = IOUtils.toByteArray(objectInputStream);
            // 替换中文
            String showFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            httpHeaders.setContentLength(bytes.length);
            httpHeaders.setContentDispositionFormData("attachment", showFileName);
            return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
        }
    
        public static boolean deleteFile(String bucket, String fileName) {
            if (StringUtils.isNullOrEmpty(fileName)) {
                throw new IllegalArgumentException("文件名称不能为空!");
            }
            bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;
            try {
                amazonS3.deleteObject(bucket, fileName);
            } catch (SdkClientException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        public static ObjectMetadata getFileInfo(String bucket, String fileName) {
            if (StringUtils.isNullOrEmpty(fileName)) {
                throw new IllegalArgumentException("文件名称不能为空!");
            }
            bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket;
            ObjectMetadata objectMetadata = null;
            try {
                objectMetadata = amazonS3.getObjectMetadata(bucket, fileName);
            } catch (SdkClientException e) {
                e.printStackTrace();
            }
            return objectMetadata;
        }
    }
    
  9. 源码地址
    https://gitee.com/xyzissj/minio.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/110822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新Microsoft Edge浏览器如何使用圆角

引入 最近我看了edge官方的文档&#xff0c;里面宣传了edge的最新UI设计&#xff0c;也就是圆角&#xff0c;但是我发现我的浏览器在升级至最新版本之后&#xff0c;却没有圆角 网上有很多人说靠实验性功能即可解锁&#xff0c;但是指令我都试过了&#xff0c;每次都是搜索无结…

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操&#xff0c;介绍了EC2的基本使用&#xff0c;并在功…

用起来顺手的在线表结构设计软件工具Itbuilder,与你共享

在线表结构设计软件工具需功能简洁&#xff0c;去除晦涩难懂的设置&#xff0c;化繁为简&#xff0c;实用为上&#xff0c;上手非常容易&#xff0c;这些itbuilder统统可以做到。 itbuilder是一款基于浏览器开发的在线表结构设计软件工具&#xff0c;借助人工智能提高效率&…

KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30

利用检索和存储访问知识库上增强大型语言模型 摘要引言2 相关研究3方法3.1 任务定义3.2 知识检索3.2.1 代码实现3.2.2 实体链接3.2.3 获取实体信息3.2.4 查找实体或值3.2.5 查找关系 3.3 知识存储 4 实验 摘要 大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现…

Flask_Login使用与源码解读

一、前言 用户登录后&#xff0c;验证状态需要记录在会话中&#xff0c;这样浏览不同页面时才能记住这个状态&#xff0c;Flask_Login是Flask的扩展&#xff0c;专门用于管理用户身份验证系统中的验证状态。 注&#xff1a;Flask是一个微框架&#xff0c;仅提供包含基本服务的…

__attribute__中的constructor和destructor--如何让程序退出时调用指定函数

背景 假设你在开发一个基础组件x&#xff0c;然后你设计了一个x_init接口用来初始化这个组件&#xff0c;相应地你设计了一个x_deinit来去初始化。这样其它模块要用到这个组件时&#xff0c;先调一下x_init, 用完了再调一下x_deinit。init和deinit这是一对很常见的接口&#x…

前端的简单介绍

前端核心的分析 CSS语法不够强大&#xff0c;比如无法嵌套书写&#xff0c;倒是模块化开发中需要书写很多重复的选择器 没有变量和合理的样式复用机制&#xff0c;使逻辑上相关的属性值必须字面量的心事重复的输出&#xff0c;导致难以维护 CSS预处理器,减少代码的笨重&#…

网课 - 网页视频-倍速播放-快进-拖动进度条-增大音量 - 火狐Firefox浏览器

本文使用的浏览器为火狐Firefox浏览器。 用浏览器播放视频&#xff0c;比如看网课、看在线电影电视剧时&#xff0c;经常能遇到的情况与解决方案&#xff1a; 音量太小&#xff0c;即使调整到100%还是不够响亮 这时可以安装插件“600% Sound Volume”, 安装之后可在原来音量的…

测试计划驱动开发模式 TPDD:一种比 TDD 更友好的开发模式

相信大部分开发团队都在使用TDD&#xff0c;并且还有很多开发团队都 对外声明 在使用 TDD 开发模式。 之所以说是“对外声明”&#xff0c;是因为很多开发团队虽然号称使用的是 TDD 开发模式&#xff0c;实际开发过程中却无法满足 TDD 的要求。 实际上&#xff0c;测试驱动的…

qt 系列(一)---qt designer设计常用操作

最近转战qt, 主要用qt designer 进行GUI开发&#xff0c;记录下实战经验~ 1.前言 qt 是跨平台C图形用户界面应用程序开发框架&#xff0c;可以使用的IDE工具有 qt creator 和 vs, 这里我主要使用 Visual Studio 2017 工具进行程序开发与编写。 2. 环境配置 只写关键步骤~~ …

笔记本电脑的键盘鼠标如何共享控制另外一台电脑

环境&#xff1a; 联想E14 x2 Win10 across 2.0 问题描述&#xff1a; 笔记本电脑的键盘鼠标如何共享控制另外一台电脑 解决方案&#xff1a; 1.下载across软件&#xff0c;2台电脑都按装&#xff0c;一台设为服务端&#xff0c;一台客户端 2.把配对好设备拖到右边左侧…

uniapp保存网络图片

先执行下载uni.downloadFile接口&#xff0c;再执行保存图片uni.saveImageToPhotosAlbum接口。 // 保存二维码 saveQrcode() {var _this this;uni.downloadFile({url: _this.qrcodeUrl, //二维码网络图片的地址success(res) {console.log(res);uni.saveImageToPhotosAlbum({fi…

21.12 Python 实现网站服务器

Web服务器本质上是一个提供Web服务的应用程序&#xff0c;运行在服务器上&#xff0c;用于处理HTTP请求和响应。它接收来自客户端&#xff08;通常是浏览器&#xff09;的HTTP请求&#xff0c;根据请求的URL、参数等信息生成HTTP响应&#xff0c;并将响应返回给客户端&#xff…

Pytorch 猫狗识别案例

猫狗识别数据集https://download.csdn.net/download/Victor_Li_/88483483?spm1001.2014.3001.5501 训练集图片路径 测试集图片路径 训练代码如下 import torch import torchvision import matplotlib.pyplot as plt import torchvision.models as models import torch.nn as…

注意!注意!注意!新规|Temu平台强制欧代英代,警惕产品被拒!

注意&#xff01;注意&#xff01;注意&#xff01;新规&#xff5c;Temu平台强制欧代英代&#xff0c;警惕产品被拒&#xff01; 欧代&#xff0c;英代信息怎么办理呢 TEMU平台上有售卖产品必需要求产品打上英代,欧代信息! 10月15日&#xff0c;Temu正式实施欧代&英代新规…

《利息理论》指导 TCP 拥塞控制

欧文费雪《利息原理》第 10 章&#xff0c;第 11 章对利息的几何说明是普适的&#xff0c;任何一个负反馈系统都能引申出新结论。给出原书图示&#xff0c;本文依据于此&#xff0c;详情参考原书&#xff1a; 将 burst 看作借贷是合理的&#xff0c;它包含成本(报文)&#xf…

Linux进程程序替换

文章目录 进程程序替换程序替换函数execl()函数调用另外一个可执行程序 execlp()函数ecexv()函数execle()函数 替换函数总结 进程程序替换 什么是进程程序替换&#xff1f;为什么要有程序替换&#xff1f; 顾名思义&#xff0c;进程程序替换就是把该进程中的程序替换掉&#x…

工程中Http的请求、各种回调函数的使用

文章目录 1、登录回调以及各种函数的使用1、SdoLoginClient工程中的SdoBase_Initialize3接口2、LoginClient中的Initialize接口3、ProcessResponse调用ProcessLoginResponse传递参数给回调函数使用4、ProcessLoginResponse登录响应接口的使用5、ProcessResponse调用然后根据req…

JavaSE 优先级队列(堆)

目录 1 二叉树的顺序存储1.1 存储方式1.2 下标关系 2 堆(heap)2.1 概念2.2 操作-向下调整2.3 操作-建堆 3 堆的应用-优先级队列3.1 概念3.2 内部原理3.3 操作-入队列(向上调整)3.4 操作-出队列(优先级最高&#xff09;3.5 返回队首元素(优先级最高)3.6 java 中的优先级队列3.7 …

【记录】使用yolov5_obb训练自己的数据集

引言 对于寻常的yolov5目标检测任务&#xff0c;只能检测水平或者垂直的检测框&#xff0c;而对于旋转框的检测却无能为力。为此&#xff0c;在这记录下使用yolov5_obb来训练自己数据集。 一、准备数据集 1、我们先看所需要的数据集文件什么样子&#xff0c;如下图文件夹Sym…