Windows中安装部署MinIo文件系统,在Spring Boot中引入MinIo依赖实现上传文件到MinIo文件系统中

minio安装部署可以看这篇教程:https://blog.csdn.net/qq_43108153/article/details/134016896

创建桶

在这里插入图片描述

在这里插入图片描述

将私有设置成公开

在这里插入图片描述

导入依赖

<!--  minio  -->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version>
</dependency>

在这里插入图片描述

yml中配置minio地址、账号密码、桶名称

minio:
#  endpoint: http://192.168.1.100:9000 #线上地址endpoint: http://127.0.0.1:9000 #本地地址accessKey: minioadminsecretKey: minioadminbucketName: mybucket

在这里插入图片描述

我们需要这三个类来处理

在这里插入图片描述

MinioClientConfig

package com.ckm.ball.config;import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/*** @author ckm* @version 1.0* @className MinIoClientConfig* @description* @create 2022/9/28 15:27*/
@Component
@Data
public class MinioClientConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.accessKey}")private String accessKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}

MinioObjectItem

package com.ckm.ball.config;import lombok.Data;/*** @author ckm* @version 1.0* @className ObjectItem* @description* @create 2022/9/28 15:30*/
@Data
public class MinioObjectItem {private String objectName;private Long size;
}

MinioUtils

package com.ckm.ball.config;import com.alipay.service.schema.util.StringUtil;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;/*** @author ckm* @version 1.0* @className MinioUtils* @description* @create 2022/9/28 15:30*/
@Component
public class MinioUtils {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucketName}")private String bucketName;/*** description: 判断bucket是否存在,不存在则创建** @return: void*/public boolean existBucket(String name) {boolean exists;try {exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());if (!exists) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());exists = true;}} catch (Exception e) {e.printStackTrace();exists = false;}return exists;}/*** 创建存储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;}/*** description: 上传文件** @param file* @return: java.lang.String*/public String upload(MultipartFile file, String bucketNameStr) {String imageId = UUID.randomUUID().toString();String fileName = file.getOriginalFilename();String[] split = fileName.split("\\.");if (split.length > 1) {fileName = split[0] + "-" + imageId + "." + split[1];} else {fileName = fileName + System.currentTimeMillis();}InputStream in = null;try {if (StringUtil.isEmpty(bucketNameStr)) {bucketNameStr = bucketName;}in = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketNameStr).object(fileName).stream(in, in.available(), -1).contentType(file.getContentType()).build());} catch (Exception e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}
//        return bucketNameStr + "/" + fileName;return fileName;}/*** description: 下载文件** @param fileName* @return: org.springframework.http.ResponseEntity<byte [ ]>*/public ResponseEntity<byte[]> download(String fileName) {ResponseEntity<byte[]> responseEntity = null;InputStream in = null;ByteArrayOutputStream out = null;try {in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());out = new ByteArrayOutputStream();IOUtils.copy(in, out);//封装返回值byte[] bytes = out.toByteArray();HttpHeaders headers = new HttpHeaders();try {headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}headers.setContentLength(bytes.length);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setAccessControlExposeHeaders(Arrays.asList("*"));responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);} catch (Exception e) {e.printStackTrace();} finally {try {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}return responseEntity;}/*** 查看文件对象** @param bucketName 存储bucket名称* @return 存储bucket内文件对象信息*/public List<MinioObjectItem> listObjects(String bucketName) {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());List<MinioObjectItem> minioObjectItems = new ArrayList<>();try {for (Result<Item> result : results) {Item item = result.get();MinioObjectItem minioObjectItem = new MinioObjectItem();minioObjectItem.setObjectName(item.objectName());minioObjectItem.setSize(item.size());minioObjectItems.add(minioObjectItem);}} catch (Exception e) {e.printStackTrace();return null;}return minioObjectItems;}/*** 批量删除文件对象** @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 bucketName 存储bucket名称*/public String getFileUrl(String bucketName, String objectFile) {try {if(StringUtil.isEmpty(bucketName)){bucketName = this.bucketName;}return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectFile).build());} catch (Exception e) {e.printStackTrace();}return null;}}

业务中测试上传图片

在这里插入图片描述

Base64ToMultipartFile转换工具类

package com.ckm.ball.utils;import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;import java.util.Base64;@Configuration
public class Base64ToMultipartFile {public MultipartFile base64ToMultipartFile (String s) {MultipartFile image = null;StringBuilder base64 = new StringBuilder("");if (s != null && !"".equals(s)) {base64.append(s);String[] baseStrs = base64.toString().split(",");byte[] b = new byte[0];b =  Base64.getDecoder().decode(baseStrs[1]);for (int j = 0; j < b.length; ++j) {if (b[j] < 0) {b[j] += 256;}}image = new BASE64DecodedMultipartFile(b, baseStrs[0]);}return image;}
}

上传成功

在这里插入图片描述

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

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

相关文章

【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作

用Nodejs操作mongodb结合Schema实现数据库操作 Mongoose创建Schema定义Schema对象并映射到数据库Model的使用创建文档内容删除文档内容修改文档内容查询文档内容 Document的使用创建并保存将文档对象转换为JSON对象 模块化数据库连接模型初始化 项目部署路由定义后端操作定义启…

如何评价《沧浪之水》这本书?

1、我一辈子的经验就是不要做瞎子&#xff0c;要把事情看清楚&#xff0c;也不能做聋子&#xff0c;该听到的信息要听到&#xff0c;但是要做哑巴&#xff0c;看到了听到了心中有数就行了&#xff0c;可千万别张口说什么。 2、说是人人平等&#xff0c;那是安慰小人物的神话&am…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF&#xff08;Primitive Equations Formulation&#xff09;湍流风场模型&#xff0c;是大气科学和气象学中用来描述大气流动和气…

使用django-haystack+whoosh实现全文搜索

前言 好像是上个星期在写代码的时候遇到了一些问题&#xff0c;这个问题似乎我之前也遇到过&#xff0c;印象中好像也写博客进行记录了的&#xff0c;于是就想在我的博客系统中“查找”&#xff08;表示很无奈居然没有搜索功能&#x1f979;&#x1f979;&#xff09;&#xff…

Redis 主从复制,、哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式&#xff08;Sentinel&#xff09; 1.主要组件和概念 2.哨…

[240711] OpenSSF Scorecard - 自动评估开源项目安全风险的工具

目录 OpenSSF Scorecard - 自动评估开源项目安全风险的工具功能特点使用场景安装和使用竞品和相关项目进一步探索 OpenSSF Scorecard - 自动评估开源项目安全风险的工具 OpenSSF Scorecard 是一个由开源安全基金会&#xff08;Open Source Security Foundation&#xff0c;Ope…

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是&#xff1a;http://localhost:8080/add?a1&b2 现在是&#xff1a;http://localhost:8080/add/a/b&#xff08;全是斜杠&#xff09; package com.demo.controller;import org.springframework.stereotype.Controller; import org…

odoo细分权限(根据业务需求)

odoo原生权限编写方式: 根据用户组分配权限 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sale_order,sale.order,model_sale_order,sales_team.group_sale_salesman,1,1, 1,0 access_sale_order_manager,sale.order.manager,model_…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册&#xff0c;往往是人机验证问题&#xff1a; kaggle网站验证

邮票孔是什么?和V割有什么区别?

邮票孔&#xff0c;也称为安装孔或通孔&#xff0c;是 PCB 中的圆形或非圆形开口&#xff0c;旨在允许将组件或 PCB 本身连接到支撑结构上。这些孔通常从顶面到底部钻穿或冲穿 PCB 层&#xff0c;形成连续的通道。冲压孔有各种尺寸和形状&#xff0c; 取决于 PCB 及其所容纳组件…

餐饮渠道年销4.2亿盒,光明look 30亿的极致大单品是如何策划的?

餐饮渠道年销4.2亿盒&#xff0c;光明look 30亿的极致大单品是如何策划的&#xff1f; 红酒代理业务下滑&#xff0c;从餐饮渠道主攻奶品类 雨帆食品集团&#xff0c;自2002年起是湖北地区红酒代理商&#xff0c;同时兼任光明乳业湖北荆州代理商。然而&#xff0c;到了2011年&a…

python--实验 9 类和对象

知识点 面向对象编程思想 面向对象编程是一种编程范式&#xff0c;它使用“对象”来设计软件&#xff0c;这些对象可以包含数据和代码&#xff0c;即属性和方法。 面向对象的程序设计的核心是对象,世间存在的万物皆为对象&#xff08;上帝式思维&#xff09; 面向对象&#xf…

TomCat服务器安装和配置教程

1.TomCat下载路径 TomCat官方网站&#xff1a;http://tomcat.apache.org 前往该网站下载安装tomcat&#xff0c;tar.gz文件是Linux操作系统的安装版本&#xff0c;zip文件是 windows操纵系统的压缩版本 打开后是如下网站&#xff0c;请下载匹配的操作系统的文件并且选择合适的…

2023 年 GitHub 上最受欢迎的编程语言

JavaScript 仍然是使用最多的编程语言&#xff0c;在 Web 开发中占据重要地位。 被广泛用于 Web 应用程序开发&#xff0c;框架如 React 和 Angular 促进了单页应用程序的开发。 Node.js 的出现使其在后端编程中同样重要。 Python 由于其简单性和广泛的库&#xff0c;Pyth…

自注意力简介

在注意力机制中&#xff0c;每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q&#xff0c;键k和值v都来自于同一组输入&#xff0c;那么这个注意力就被称为是自注意力&#xff08;self-attention&#xff09;。自注意力这部分理论&#xff0c;我觉得台大李宏毅老师…

新兴商业模式如何破局?市场策划专家的实战指南

在这个融合了传统市场、互联网和信息技术的大潮中&#xff0c;想要在市场营销策划上玩得转&#xff0c;咱们得有超凡的全局思维和跨界的协作精神。 下面&#xff0c;我就来和大家聊聊如何在这样一个复杂环境下搞定市场营销策划&#xff0c;让你在竞争激烈的市场中脱颖而出。 …

Nodejs 第八十二章(Nacos动态配置)

什么是动态配置&#xff1f; 在Nacos中&#xff0c;动态配置是指可以在运行时动态修改应用程序的配置信息&#xff0c;而不需要重新启动或重新部署应用程序。通过Nacos的动态配置功能&#xff0c;开发人员可以将应用程序的配置信息存储在Nacos服务器中&#xff0c;并在需要时进…

PTK是如何加密WLAN单播数据帧的?

1. References WLAN 4-Way Handshake如何生成PTK&#xff1f;-CSDN博客 2. 概述 在Wi-Fi网络中&#xff0c;单播、组播和广播帧的加密算法是由AP决定的。其中单播帧的加密使用PTK密钥&#xff0c;其PTK的密钥结构如下图所示&#xff1a; PTK的组成如上图所示&#xff0c;由K…

做一个专业的声音分析系统,需要对声音那些评判标准进行计算

为了构建一个专业的声音分析系统&#xff0c;需要对以下评判标准进行计算。每个标准需要相应的算法和技术指标来实现。下面是一些关键的评判标准和如何计算这些标准的具体方法&#xff1a; 1. 音质 清晰度 信噪比&#xff08;SNR&#xff09;&#xff1a;计算音频信号中的信…

win11下部署Jenkins,build c#项目

一个c#的项目&#xff0c;由于项目经理总要新版本测试&#xff0c;以前每次都是手动出包&#xff0c;现在改成jenkins自动生成&#xff0c;节省时间。 一、下载Jenkins&#xff0c; 可以通过清华镜像下载Index of /jenkins/windows-stable/ | 清华大学开源软件镜像站 | Tsingh…