【JavaWeb后端学习笔记】Java上传文件到阿里云对象存储服务
阿里云对象存储
- 1、创建阿里云对象存储节点
- 2、上传文件
- 2.1 修改项目配置文件
- 2.2 定义一个Properties类获取配置信息
- 2.3 准备一个alioss工具类
- 2.4 创建注册类,将AliOssUtil 注册成Bean
- 2.5 使用AliOssUtil 工具类上传文件
- 2.6 注意事项
使用阿里云对象存储服务分为以下几步:
1、创建阿里云对象存储节点
首先需要创建阿里云对象存储节点。获取endpoint、accessKeyId、accessKeySecret、bucketName四个信息。
- 进入阿里云官网,并注册登录。
- 鼠标悬放在产品上,然后悬放到存储上,然后点击对象存储OSS。
- 点击管理控制台。进入对象存储OSS管理控制台。
- 创建Bucket。如果是第一次使用对象存储OSS服务,则首先需要开通服务。开通后点击左上角Bucket列表;点击创建Bucket;修改Bucket名称;点击完成创建。注意复制Endpoint信息。
- 获取AccessKey ID和 AccessKey Secret。保存好AccessKey ID和 AccessKey Secret。
- 记录需要的四个信息。
endpoint:在创建Bucket时选择地域,下面会有对应的Endpoint。
bucketName:创建Bucket时自定义。
AccessKey ID和 AccessKey Secret:加密获取。
2、上传文件
2.1 修改项目配置文件
在项目配置文件中定义endpoint、accessKeyId、accessKeySecret、bucketName四个信息。这里使用的是yaml格式配置文件。
web:alioss:access-key-id: ---access-key-secret: ---bucket-name: ---endpoint: ---
2.2 定义一个Properties类获取配置信息
可以新建一个properties包,专门存放用于获取配置信息相关的类。
这里创建一个AliOssProperties类,用于保存与阿里云对象存储OSS服务相关的四个信息。
需要在该类上增加几个注解:
- @Component:将该类注册成Bean;
- @ConfigurationProperties:给prefix 属性赋值对应的配置文件信息。这里是"web.alioss"。该注解的作用是从配置文件获取配置信息,并将配置信息赋值非成员变量。需要注意配置文件中的名称与成员变量名一致,或者配置文件名使用 - 隔开,成员变量名使用驼峰命名法。
- @Data:Lombok注解,生成get/set等方法。
@Component // 将该类注册成Bean
@ConfigurationProperties(prefix = "web.alioss") // 从配置文件中获取配置信息赋值给成员变量
@Data // 生成get/set等方法
public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}
此处使用到了Lombok提供的注解,需要引入Lombok相关依赖:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
2.3 准备一个alioss工具类
阿里云官方提供许多简单实现代码供参考:阿里云对象存储文档中心。这里使用已经封装好的工具类。使用前需要引入阿里云oss相关依赖。
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
如果是Java9及以上版本,还需要添加JAXB相关依赖:
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
同样可以专门创建一个utils包存放工具类。可以看到工具类AliOssUtil中有四个成员变量,分别于四个关键信息对应。
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}
}
2.4 创建注册类,将AliOssUtil 注册成Bean
创建一个OssConfiguration 类,使用@Configuration 修饰,使其成为注册类。同时将配置文件中的配置信息传递给工具类的成员变量。配置类也可以创建一个config包存放。
@Configuration // 配置类
@Slf4j
public class OssConfiguration {@Bean // 第三方Bean交给Spring容器管理@ConditionalOnMissingBean // 如果IOC容器中没有该Bean,则创建public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {log.info("开始创建阿里云文件上传工具类对象...");return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}
注意:
- 类上需要加@Configuration注解,使其成为注册类;
- 在类中定义一个方法。方法返回值类型是AliOssUtil 工具类。该方法传入参数为上述定义好的AliOssProperties类对象。在方法体中使用带参构造方法创建一个AliOssUtil 对象,并返回;
- 使用@Bean注解修饰该方法,第三方Bean交给Spring容器管理;
- 使用@ConditionalOnMissingBean注解,如果IOC容器中没有该Bean,则创建;
2.5 使用AliOssUtil 工具类上传文件
文件上传一般作为项目的controller层,由于是一个通用业务,所以一般会命名CommonController。
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil; // 1. 注入AliOssUtil Bean对象/*** 文件上传* @param file* @return*/@PostMapping("/upload")public Result<String> upload(MultipartFile file) { // 2. 使用MultipartFile 对象接收文件log.info("文件上传:{}", file);try {// 3. 获取原始文件名String originalFilename = file.getOriginalFilename(); // 4. 获取原始文件名后缀int index = originalFilename.lastIndexOf(".");String extname = originalFilename.substring(index);// 5. 构建UUID随机文件名String newFilename = UUID.randomUUID().toString() + extname;// 6. 调用upload()方法上传文件String filePath = aliOssUtil.upload(file.getBytes(), newFilename);return Result.success(filePath);} catch (IOException e) {e.printStackTrace();log.error("文件上传失败:{}", e);}return Result.error("文件上传失败...");}
}
这里接口的返回值为Restlt,是后端统一返回结果的格式。
/*** 后端统一返回结果* @param <T>*/
@Data
public class Result<T> implements Serializable {private Integer code; //编码:1成功,0和其它数字为失败private String msg; //错误信息private T data; //数据public static <T> Result<T> success() {Result<T> result = new Result<T>();result.code = 1;return result;}public static <T> Result<T> success(T object) {Result<T> result = new Result<T>();result.data = object;result.code = 1;return result;}public static <T> Result<T> error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}
}
2.6 注意事项
在controller接口中有两个地方值得注意:
- upload()接收的的参数类型是MultipartFile,SpringBoot默认上传的文件大小有限。当上传大文件时需要在配置文件中修改相关配置。
max-file-size:指单个文件最大不超过10MB
max-request-size:指一次请求的文件总量不超过100MB
spring:servlet:multipart:max-file-size: 10MBmax-request-size: 100MB
- 在上传到阿里云前,需要对文件名进行修改,保证文件名唯一。可以使用UUID设置文件名。
相关文章:

【JavaWeb后端学习笔记】Java上传文件到阿里云对象存储服务
阿里云对象存储 1、创建阿里云对象存储节点2、上传文件2.1 修改项目配置文件2.2 定义一个Properties类获取配置信息2.3 准备一个alioss工具类2.4 创建注册类,将AliOssUtil 注册成Bean2.5 使用AliOssUtil 工具类上传文件2.6 注意事项 使用阿里云对象存储服务分为以下…...

网盘管理系统
文末获取源码和万字论文,制作不易,感谢点赞支持。 设计题目:网盘管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软…...

learn-(Uni-app)跨平台应用的框架
使用 Vue.js 开发所有前端应用的框架,开发者编写一份代码,可发布到iOS、Android、Web(包括微信小程序、百度小程序、支付宝小程序、字节跳动小程序、H5、App等)等多个平台。 跨平台:Uni-app 支持编译到iOS、Android、W…...

趋同进化与趋异进化的区别及分析方法-随笔03
趋同进化与趋异进化的区别及分析方法 1. 引言 在生物学中,进化是指生物种群随着时间的推移,通过遗传变异、自然选择、基因漂变等机制的作用,逐渐改变其基因型和表型的过程。进化的方式有很多种,其中趋同进化(Converg…...

2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序
2024年华中杯数学建模 B题 使用行车轨迹估计交通信号灯周期问题 原题再现 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据&#x…...

高效查找秘密武器一:位图
有这样的一个问题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历,时间复杂度O(n) 2.排序(N*logN),…...

自回归模型(AR )
最近看到一些模型使用了自回归方法,这里就学习一下整理一下相关内容方便以后查阅。 自回归模型(AR ) 自回归模型(AR )AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…...

Linux内核 -- Linux驱动从设备树dts文件中读取字符串信息的方法
从Linux设备树读取字符串信息 在Linux内核中,从设备树(DTS)中读取字符串信息,通常使用内核提供的设备树解析API。这些API主要位于<linux/of.h>头文件中。 常用函数解析 1. of_get_property 获取设备树中的属性。原型:con…...

图片懒加载+IntersectionObserver
通过IntersectionObserver实现图片懒加载 在JavaScript中,图片懒加载可以通过监听滚动事件和计算图片距离视口顶部的距离来实现 在HTML中,将src属性设置为一个透明的1x1像素图片作为占位符,并将实际的图片URL设置为data-src属性。 <img c…...

MySQL的获取、安装、配置及使用教程
一、获取MySQL 官网地址:https://www.mysql.com MySQL产品:企业版(Enterprise)和社区版(Community)社区版是通过GPL协议授权的开源软件,可以免费使用。企业版是需要收费的商业软件 MySQL版本历史:5.0、5.5、5.6、5.7和8.0(最新版本)两种打包版本:MSI(安装版)和ZI…...

Odoo在线python代码开发
《Odoo在线python代码开发从入门到精通》 从简入手,由浅入深,Odoo开发不求人 以实例促理解,举一反三 从Python到Odoo,低代码开发的正解之路 代码视频讲解与代码注释配合,帮助用户真正理解每一句代码的作用 《Odoo在…...

在.NET 6中使用Serilog收集日志
此示例的完整详细信息:https://download.csdn.net/download/hefeng_aspnet/89998498 Serilog 是一个日志库,它提供对文件、控制台和其他几个地方的记录。它易于配置,并且具有干净且易于使用的界面。 Serilog具有无与伦比的输出目的地选择&…...

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(中):D3 饼图布局生成器的配置方法
当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(上篇)5.1.2 饼图布局生成器(中篇) ✔️5.1.3 圆弧的绘制5.1.4 数据标签的添加 文章目录 5.1.2 饼图布局生成器 The …...

离线安装ollama到服务器
搜了很多教程不满意,弄了半天才弄好,这里记录下,方便以后的人用,那个在线下载太慢,怕不是得下载到明年。 一.从官网下在liunx版的tgz安装包 Releases ollama/ollama (github.com) 查看自己的服务器信息(参考 https:/…...

自动化点亮LED灯之程序编写
程序编写: #!/bin/shecho none > /sys/class/leds/led1/triggerecho none > /sys/class/leds/led2/triggerecho none > /sys/class/leds/led3/triggerecho 0 > /sys/class/leds/led1/brightnessecho 0 > /sys/class/leds/led2/brightnessecho 0 >…...

linux 系列服务器 高并发下ulimit优化文档
系统输入 ulimit -a 结果如下 解除或提高 Linux 系统的最大进程数 在高并发场景中,合理设置 Linux 系统的最大进程数对于提升服务器性能至关重要。以下是具体步骤: 临时修改 ulimit 设置 可以通过 ulimit 命令临时调整当前会话的最大进程数。 查看当前…...

人工智能入门数学基础:统计推断详解
人工智能入门数学基础:统计推断详解 目录 前言 1. 统计推断的基本概念 1.1 参数估计 1.2 假设检验 2. 统计推断的应用示例 2.1 参数估计示例:样本均值和置信区间 2.2 假设检验示例:t检验 3. 统计推断在人工智能中的应用场景 总结 前言…...

Spark区分应用程序 Application、作业Job、阶段Stage、任务Task
目录 一、Spark核心概念 1、应用程序Application 2、作业Job 3、阶段Stage 4、任务Task 二、示例 一、Spark核心概念 在Apache Spark中,有几个核心概念用于描述应用程序的执行流程和组件,包括应用程序 Application、作业Job、阶段Stage、任务Task…...

【Liunx篇】基础开发工具 - yum
文章目录 🌵一.Liunx下安装软件的方案🐾1.源代码安装🐾2.rpm包安装🐾3.包管理器进行安装 🌵二.软件包管理器-yum🌵三.yum的具体操作🐾1.查看软件包🐾2.安装软件包🐾3.卸载…...

docker学习笔记(五)--docker-compose
文章目录 常用命令docker-compose是什么yml配置指令详解versionservicesimagebuildcommandportsvolumesdepends_on docker-compose.yml文件编写 常用命令 命令说明docker-compose up启动所有docker-compose服务,通常加上-d选项,让其运行在后台docker-co…...

电子商务人工智能指南 4/6 - 内容理解
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...

Hadoop3集群实战:从零开始的搭建之旅
目录 一、概念 1.1 Hadoop是什么 1.2 历史 1.3 三大发行版本(了解) 1.4 优势 1.5 组成💗 1.6 HDFS架构 1.7 YARN架构 1.8 MapReduce概述 1.9 HDFS\YARN\MapReduce关系 二、环境准备 2.1 准备模版虚拟机 2.2 安装必要软件 2.3 安…...

Kotlin设计模式之桥接模式
桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。Kotlin中可以通过接口和抽象类来实现桥接模式。以下是桥接模式的实现方法: 一. 基本桥接模式 在这种模式中,定义一个抽象部分和一个实现部分,通过组合将它们连接起来…...

详解组合模式
引言 有一种情况,当一组对象具有“整体—部分”关系时,如果我们处理其中一个对象或对象组合(区别对待),就可能会出现牵一发而动全身的情况,造成代码复杂。这个时候,组合模式就是一种可以用一致的…...

【系统架构设计师论文】云上自动化运维及其应用
随着云计算技术的迅猛发展,企业对云资源的需求日益增长。为了应对这一挑战,云上自动化运维(CloudOps)应运而生,它结合了DevOps理念和技术,通过自动化工具和流程来提高云环境的管理效率和服务质量。本文将探讨云上自动化运维的主要衡量指标,并详细介绍一个实际项目中如何…...

交换排序----快速排序
快速排序 快速排序是一种高效的排序算法,它采用分治法策略,将数组分为较小和较大的两个子数组,然后递归排序两个子数组。 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序…...

ES 与 MySQL 在较大数据量下查询性能对比
在进行数据查询性能测试的过程中,我的同事幺加明对 ES(Elasticsearch)和 MySQL 进行了相对较大数据量的测试,并整理了相关结果。在得到其授权的情况下,我将此对比案例分享给大家,在此再次向幺加明表示感谢。…...

C# 新语法中的字符串内插$和{}符号用法详解
自C#6.0开始提供一个新的语法糖,即"$" 符号,配合“{}”使用,它的作用除了是对String.format的简化,还可设置其格式模板,实现了对字符串的拼接优化。 语法格式: $"string {变量表达式}” 语…...

Nacos源码学习-本地环境搭建
本文主要记录如何在本地搭建Nacos调试环境来进一步学习其源码,如果你也刚好刷到这篇文章,希望对你有所帮助。 1、本地环境准备 Maven: 3.5.4 Java: 1.8 开发工具:idea 版本控制工具: git 2、下载源码 官方仓库地址 :https://git…...

windows 好工具
Windows文件夹目录大小分析工具WizTree...