SpringBoot+MINIO

news2025/1/18 8:47:48
  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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信换手率指标公式,衡量股票的活跃程度

换手率是指在一定时间内股票的交易量与流通股本的比率&#xff0c;反映了股票的流动性和市场交易活跃程度。换手率高意味着股票的交易频繁&#xff0c;市场上的买卖力量较强&#xff0c;反之换手率低则表示交易相对较少。高换手率可能意味着投资者对该股票有较大的兴趣或者存在…

多路IO—POll函数,epoll服务器开发流程

引言 "在计算机网络编程中&#xff0c;多路IO技术是非常常见的一种技术。其中&#xff0c;Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求&#xff0c;提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法&am…

asp.net旅游交流管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 旅游交流管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net旅游交流网站1 应用技…

【脑机接口 论文】利用脑机接口帮助ALS患者恢复对家用设备的控制science

英文题目 中文题目 稳定的语音BCI解码使ALS患者在3个月内无需重新校准即可进行控制论文下载&#xff1a;算法程序下载&#xff1a;摘要1 项目介绍2 方法2.1实时神经解码2.2算法手术植入:神经解码模型: 数据收集实验2.3稳定的解码器性能超过三个月 3 电极的贡献4 讨论5结论 中文…

Linux shell编程学习笔记18:while循环语句

上回我们研究和探讨了Linux shell编程中for 循环语句&#xff0c;与在C/C中一样&#xff0c;for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。 一、数字条件循环 我们继续以for循环语句中的例子&#xff0c;计算 从1到10与2的乘积 并输出…

实时定位和配送追踪:开发万岳同城外卖APP的关键技术特性

随着生活节奏的不断加快&#xff0c;外卖服务已经成为许多人日常生活中不可或缺的一部分。无论是工作日的午餐&#xff0c;还是周末的家庭聚会&#xff0c;外卖APP已经成为满足各种美食需求的首选方式。然而&#xff0c;同城外卖APP的成功不仅仅取决于美味的食物选择&#xff0…

python 打印与去除不可见字符 \x00

# 此处不是真实的\x00 被 空格替换了 text "boot_1__normal/ " print(text.strip()"boot_1__normal/") # 打印不可见字符 print(repr(text))>>> False boot_1__normal/\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0…

[HGAME 2023 week1]Classic Childhood Game js前端查看

记录一下 给了我们一个游戏 按照web的尿性 都是要通关或者干嘛才可以 我们现在去看看js 这里发现结局的函数 window.setTimeout(function () {Message ["[Hero]玩家&#xff0c;恭喜你&#xff01;通关普通结局的纪元魔塔。", "[Npc3,仙子]谢谢支持&#xff…

私募机构全球化视野探析 | 活动回顾

10月21日&#xff0c;华锐技术、国泰君安证券和亚马逊云科技在深圳联合举办了一场主题为“私募机构全球化视野探析”的交流活动&#xff0c;广深及周边地区数十家机构近百人参会。本次活动众多行业大咖和专家从服务、技术、数据、资金等多个角度&#xff0c;共同探讨私募机构全…

【高效开发工具系列】你真的会使用Mac吗?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

leetcode第369周赛

2917. 找出数组中的 K-or 值 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums …

旅行社信息展示服务预约小程序的作用是什么

出行旅游近些年人次非常多&#xff0c;除了自己出行外&#xff0c;旅行社成为众多人的选择&#xff0c;而随着消费者线上信息获取度增加&#xff0c;因此对商家来说也需要线上发展实现赋能。 那么通过【雨科】平台做个旅行社小程序有什么效果呢&#xff1f; 1、品牌宣传、内容…

解决深度学习训练时使用tensorboard http://localhost:6006/无法访问此网站问题

在windows上跑yolov5模型使用了Tensorboard来查看训练过程&#xff0c;开始训练&#xff0c;终端就会提示 直接点击这个网址&#xff0c;就会出现 解决办法是重新开一个终端&#xff0c;激活目前正在使用的虚拟环境&#xff0c;在下面输入 tensorboard --logdir runs\train -…

项目赶工期,如何预防团队成员任务冲突?

项目赶工期时&#xff0c;如果发生任务冲突&#xff0c;往往会直接影响工作进度和效率&#xff0c;可能会导致任务的延误或错失关键节点&#xff0c;进而影响整个项目进度。因此预防团队成员任务冲突对于项目进度至关重要。它可以提高工作效率&#xff0c;保证项目进度&#xf…

Linux中的lrzsz 玩法

一、介绍 lrzsz是一款在Linux里可代替ftp上传和下载的程序&#xff0c;也就是一款软件。它是开发者常用的一款工具&#xff0c;这个工具用于windows机器和远端的Linux机器通过XShell传输文件。 二、lrzsz的安装 在安装之前&#xff0c;我们可以使用下述命令先查看yum仓库中是否…

cad怎么转换成pdf?

cad怎么转换成pdf&#xff1f;cad是什么格式&#xff1f;CAD是计算机辅助设计&#xff08;Computer-Aided Design&#xff09;的缩写&#xff0c;是一种用于制图和设计的软件。CAD软件可以帮助工程师、建筑师、设计师等专业人士创建和编辑各种类型的图形和设计&#xff0c;如平…

行云创新加入深圳市人工智能行业协会

近日&#xff0c;行云创新正式加入深圳市人工智能行业协会。标志着行云创新在人工智能领域的实力和影响力得到了市场更加广泛和深入的认可&#xff0c;展示了行云创新对于深入参与人工智能行业发展&#xff0c;以及与其他领先企业共同推动中国人工智能技术进步的坚定决心。 行…

leetcode:88. 合并两个有序数组(python3解法)

难度&#xff1a;简单 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&am…

HBuilderX实现安卓真机调试

1. 简介 HBuilderX 简称 HX&#xff0c;HBuilder&#xff0c;H 是 HTML 的缩写&#xff0c;Builder 是建设者。是为前端开发者服务的通用 IDE&#xff0c;或者称为编辑器。与 vscode、sublime、webstorm 类似。 它可以开发普通 web 项目&#xff0c;也可以开发 DCloud 出品的 u…

PowerDesigner 16数据库(mysql)逆向生成pdm

1、配置数据源 2、测试数据源 but~~~~没成功&#xff0c;shift