SpringBoot项目实现文件上传,MINIO+OSS阿里云

MINIO 安装以及部署

官网:MinIO | Code and downloads to create high performance object storage

下载后是一个minio.exe的文件,可以先创一个文件夹来存放数据以及文件

在文件的目录下cmd进入控制台

minio.exe server data

启动成功后控制台会打印账号密码

访问地址:http://127.0.0.1:9000,输入账号密码登录页面

创建桶

解读一下:

bucket name:bucket名字。
versioning: 版本控制允许在同一个键下保留同一个对象的多个版本。
object locking:对象锁定防止对象被删除。需要支持保留和合法持有。只能在创建桶时启用。
quota:配额用于限制桶内的数据量。
retention:保留是指在一段时间内防止对象删除的规则。为了设置桶保留策略,必须启用版本控制。

文件上传测试

Spring使用minio

在官网下找到最新的依赖包

添加依赖后,在yml文件下配置相关配置

添加minio的配置文件,注意:@Value的注解导入是spring的原生注解

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint(endpoint).credentials(accessKey,secretKey).build();}
}

创建工具类,实现文件上传

 /*** 上传文件到指定的存储桶中** @param bucketName 存储桶名称* @param file 上传的文件* @param objectName 存储对象的名称* @param contentType 文件的内容类型* @return 文件上传的响应对象* @throws Exception 如果上传过程中发生异常*/@SneakyThrows(Exception.class)public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {InputStream inputStream = file.getInputStream();return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(inputStream, inputStream.available(), -1).build());}

controller层实现接口调用

 @PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {try {System.out.println(123);//文件名String fileName = file.getOriginalFilename();String newFileName = System.currentTimeMillis() + "." + StringUtils.substringAfterLast(fileName, ".");//类型String contentType = file.getContentType();minioTemplate.uploadFile(minioConfig.getBucketName(), file, newFileName, contentType);return "上传成功";} catch (Exception e) {e.printStackTrace();log.error("上传失败");return "上传失败";}}

postman测试结果

Spring实现阿里云OSS文件上传

创建Bucket时需要记录Endpoint访问节点

再在管理创建用户拿到对应的ID以及Secret

在yml文件中配置相对应的配置

创建OSS配置文件以及工具类

@Service
public class FileServiceImpl implements FileService {@Autowiredprivate OSSConfig ossConfig;private Logger log;@Overridepublic String upload(MultipartFile file) {//获取相关配置String bucketName = ossConfig.getBucketName();String endPoint = ossConfig.getEndPoint();String accessKeyId = ossConfig.getAccessKeyId();String accessKeySecret = ossConfig.getAccessKeySecret();//创建OSS对象OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);//获取原生文件名String originalFilename = file.getOriginalFilename();//JDK8的日期格式LocalDateTime time = LocalDateTime.now();DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd");//拼装OSS上存储的路径String folder = dft.format(time);String fileName = generateUUID();String extension = originalFilename.substring(originalFilename.lastIndexOf("."));//在OSS上bucket下的文件名String uploadFileName = "user/" + folder + "/" + fileName + extension;try {PutObjectResult result = ossClient.putObject(bucketName, uploadFileName, file.getInputStream());//拼装返回路径if (result != null) {return "https://"+bucketName+"."+endPoint+"/"+uploadFileName;}} catch (IOException e) {log.error("文件上传失败:{}",e.getMessage());} finally {//OSS关闭服务,不然会造成OOMossClient.shutdown();}return null;}/*** 获取随机字符串* @return*/private String generateUUID() {return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);}
}

OSSconfig

@ConfigurationProperties(prefix = "aliyun.oss")
@Configuration
@Data
public class OSSConfig {private String endPoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}

Controller层进行测试

@PostMapping("/upload")public Map<String , Object> uploadFile(@RequestPart("file") MultipartFile file) {String FileStr = fileService.upload(file);return buildResult(FileStr);}

测试结果

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

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

相关文章

Raspbian命令行RTSP/RTP服务

Raspbian命令行RTSP/RTP服务 1. 源由2. Raspbian摄像头2.1 命令行启动RTP摄像头2.2 命令行启动RTSP摄像头 3. 示例3.1 测试RTP摄像头3.2 测试RTSP摄像头3.3 QGroundControl测试3.3.1 RTSP配置3.3.2 RTP配置 4. 总结5. 参考资料 1. 源由 鉴于实际测试发现RTP协议下&#xff0c;…

利用DevOps和ITSM的集成能促进IT技术

在当今这个快节奏和技术驱动的世界里&#xff0c;DevOps 和 IT 服务管理&#xff08;ITSM&#xff09;理念在培养心理健康和减少技术压力的工作环境中正在发挥重要作用。混合最佳实践&#xff0c;实现更好、更快、更安全的服务。 什么是DevOps&#xff1f; DevOps 专注于采用协…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

猫头虎分享已解决Bug || ValueError: Setting an array element with a sequence.

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

python 基础知识点(蓝桥杯python科目个人复习计划49)

今日复习内容&#xff1a;做复习题 例题1&#xff1a;希尔排序 题目描述&#xff1a; 希尔排序是直接插入排序算法的一种更高效的改进版本&#xff0c;但它是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出的改进方法之一&#xff1a; 1.插入排序在对几乎已经…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…

Spring 手动实现Spring底层机制

目录 一、前言 二、Spring底层整体架构 1.准备工作 : 2.架构分析 : &#xff08;重要&#xff09; 3.环境搭建 &#xff1a; 三、手动实现Spring容器结构 1.自定义注解 : 1.1 Component注解 1.2 Scope注解 2.自定义组件 : 3.自定义用于封装Bean信息的BeanDefinition类&a…

【MySQL系列 04】深入浅出索引

一、索引介绍 提到数据库索引&#xff0c;相信大家都不陌生&#xff0c;在日常工作中会经常接触到。比如某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。 但到底什么是索引&#xff0c;索引又是如何工作的…

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify &#x1f332;volatile关键字&#x1f6a9;保证内存可见性&#x1f6a9;volatile 不保证原⼦性 &#x1f333;wait 和 notify方法&#x1f6a9;wait()&#x1f6a9;notify()&#x1f6a9;notifyAll()方法 ⭕wait 和 sleep 的对比&#xff08; 面试题…

基础光学系列:(一)光学在机器视觉中的角色:原理、应用与学习途径

光学是一门研究光的产生、传播以及与物质相互作用的科学&#xff0c;对于机器视觉技术的发展至关重要。机器视觉利用计算机和相机系统模拟人类视觉&#xff0c;解释和理解图像&#xff0c;广泛应用于制造业、医疗、安全监控等领域。本文旨在探讨光的传播原理及其在机器视觉中的…

低于API等级30的应用将无法在上述应用商店

minSdkVersion minSdkVersion用于指定应用兼容的最低Android版本&#xff08;API等级&#xff09;。 如果APP某些功能无法支持低版本Android系统的设备&#xff0c;可以配置minSdkVersion确保APP只能安装到指定Android版本以上的设备。HBuilder|HBuilderX中可在manifest.json中…

Linux快速修改ip地址

Linux修改IP配置 一 、查找ip配置文件 ifcfg-ens33二、编辑 vi ifcfg-ens33文件三、重启网络或者重启系统 一 、查找ip配置文件 ifcfg-ens33 cd /etc/sysconfig/network-scripts/ls //查看network-scripts文件夹下面的文件二、编辑 vi ifcfg-ens33文件 vi ifcfg-ens33注意&…

机器学习 深度学习资料 资源machine learning

Kaggle入门&#xff0c;看这一篇就够了 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/25686876 day1-1.什么是机器学习_哔哩哔哩_bilibiliday1-1.什么是机器学习是10天学会机器学习从入门到深度学习的第1集视频&#xff0c;该合集共计62集&#xff0c;视频收藏或关注UP主&a…

【MySQL】如何理解MySQL的存储引擎

一、常见存储引擎 我们可以知道表的类型是由存储引擎决定的&#xff0c;如图所示&#xff0c;我们可以看到MySQL中支持八种储存引擎&#xff0c;那么我们这里就介绍常用的三种存储引擎&#xff0c;分别是Innodb、MyISAM、Memory。 二、Innodb、MyISAM、Memory的特点 1、Inno…

day10-项目集成sharding-jdbc-今日指数

项目集成sharding-jdbc 目标 1.掌握shardingjdbc标准分片模式&#xff1b; 2.理解项目分库分表的设计思路&#xff1b; 3.理解分库分表代码实现流程&#xff1b; 第一章 项目分库分表实现 1、股票数据预期增长分析 ​ 由于今日指数是偏向海量数据分析的产品&#xff0c;而…

Go语言基础总结

一、Go语言结构 包声明 引入包 函数 变量 语句&表达式 注释 下面简单给出hello.go文件。 package src /*定义包名*/import "fmt" /*引入包*/func hello() { /*函数*/fmt.Println("Hello,World!") /*语句&表达式*/fmt.Println("菜鸟教…

深度学习环境配置常见指令

首先打开anaconda prompt&#xff0c;激活对应虚拟环境。 导入torch并获取对应版本 import torch torch.__version__导入torchvision并获取对应版本 import torchvision torchvision.__version__ 检查cuda是否可用 torch.cuda.is_available() 获取CUDA设备数 torch.cuda.…

基于SpringBoot的气象数据监测分析大屏

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

数据仓库选型建议

1 数仓分层 1.1 数仓分层的意义 **数据复用&#xff0c;减少重复开发&#xff1a;**规范数据分层&#xff0c;开发一些通用的中间层数据&#xff0c;能够减少极大的重复计算。数据的逐层加工原则&#xff0c;下层包含了上层数据加工所需要的全量数据&#xff0c;这样的加工方…

GEE必须会教程—邂逅线代中的矩阵(Array类型)

矩阵&#xff0c;一个令人头疼的名字&#xff0c;学过线性代数的友友们想必对矩阵的运算规则烂熟于心&#xff0c;与它延申出来的向量知识曾经让我们深陷其中。矩阵在高级的数据存储中占据着重要的地位。定义字典类型的过程&#xff0c;其实就是寻找key和value关系的过程&#…