9、JavaWeb-文件上传-配置文件

P146 案例-文件上传-简介

文件上传,将本地图片、视频等文件上传到服务器,供其他用户浏览下载的过程。

文件上传前端页面三要素:

在这里插入图片描述

如果前端表单的编码格式选择的默认编码方式x-www.form-urlencoded,则提交的文件仅仅是文件名,文件内容没有提交到服务端,所以表单编码方式应该选择multipart/form-data,不然不能提交真正的文件内容。

图片、音频上传后文件内容可能是乱码。

服务端如何接收上传文件呢?

例如:springboot当中提供了multipartfile这个api,利用这个api可以接收上传文件,注意保证参数名和前端属性名一致。

在这里插入图片描述

P147、148、149、150 案例-文件上传-本地存储-OSS存储

服务端接收后是临时文件,之后就清除了。

两种存储方案:

1、本地存储

将文件存储在本地服务器磁盘中,multipartfile提供了保存磁盘的方法transferto。

下面是使用案例:

 @PostMapping("/upload")public Result upload(String name, Integer age, MultipartFile image) throws Exception{log.info("文件上传:{}, {}, {}",name, age, image);// 获取原始文件名String originalFilename = image.getOriginalFilename();image.transferTo(new File("E:\\mycodes\\ideaProject\\javaweb\\javaweb_project\\springboot-tlias\\springboot-tlias\\src\\main\\resources\\img\\"+originalFilename));return Result.success();}

对上述操作优化:如果直接采用原始名存储,则会造成存在相同名称的文件会相互冲突,后来的文件会覆盖掉前面的文件,因此需要保证每一个文件是唯一的,如何构造唯一的文件名?

时间戳也不一定,采用uuid解决。

uuid:通用唯一识别码,长度固定的字符串且不重复,

//    uuid示例
//    java.util中有UUID工具类@Testpublic void testUuid(){for (int i = 0; i < 100; i++){String s = UUID.randomUUID().toString();System.out.println(s);}}

输出如下所示:输出32位,4个-,总长36位,

在这里插入图片描述

但是uuid不存在文件名后缀,所以需要添加文件扩展名,如何获取文件扩展名?截取.之后的

因此使用UUID改进后的方法如下所示:

 @PostMapping("/upload")public Result upload(String name, Integer age, MultipartFile image) throws Exception{log.info("文件上传:{}, {}, {}",name, age, image);// 获取原始文件名String originalFilename = image.getOriginalFilename();// 获取文件扩展名,即.之后的int index = originalFilename.lastIndexOf(".");// 从index截取到尾部获得扩展名String extname = originalFilename.substring(index);String newFileName = UUID.randomUUID().toString() + extname;log.info("获取到新的文件名:{}", newFileName);image.transferTo(new File("E:\\mycodes\\ideaProject\\javaweb\\javaweb_project\\springboot-tlias\\springboot-tlias\\src\\main\\resources\\img\\"+newFileName));return Result.success();}

能够成功以UUID保存文件

默认情况下上传文件不能超过超过1M,否则会报错,如果需要上传大文件,可以进行如下配置:在Properties中

# 配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB# 配置单个请求最大上传大小,一次请求可上传多个 文件
spring.servlet.multipart.max-request-size=100MB

存储本地磁盘缺点:

  • 无法直接访问本地

  • 服务器磁盘满了不方便扩容

  • 如果磁盘坏了则会造成损失

multipartfile常用方法:

  • String getOriginalFilename()获取原始文件名

  • void transferTo(File dest)将接收的文件转存到磁盘文件中

  • long getSize()获取文件的大小,单位为字节

  • byte[] getBytes()获取文件内容的字节数组

  • InputStream getInputStream()获取接收到的文件内容的输入流

不用本地存储,常用

  • 项目组自己搭建的文件存储服务,例如分布式服务或集群

  • 使用云服务,方便可靠

2、云存储

阿里云,“云”即互联网,云服务即通过互联网提供各种各样的服务。

OSS对象存储服务,object storage service,可通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

您可以进行以下操作:

  • 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。

  • 通过获取已上传文件的地址进行文件的分享和下载。

  • 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。

  • 在阿里云管理控制台执行基本和高级OSS任务。

  • 使用阿里云开发工具包或直接在应用程序中进行RESTful API调用执行基本和高级OSS任务

学习如何使用云服务。

第三方服务通用思路:

  • 准备工作

  • 参照官方SDK编写入门程序

  • 集成使用

bucket是阿里云OSS中的存储空间,即用户存储对象的容器,所有的对象都必须隶属于某个存储空间。使用步骤

在这里插入图片描述

可在官方使用文档中进行查看手册,创建好bucket之后,在项目中引入依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>

编写测试单元进行测试,参照文件流上传示例,下面是核心操作

 // 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObject请求。ossClient.putObject(bucketName, objectName, inputStream);} catch (OSSException oe) {

完整如下:可以上传成功,并且上传的每个文件还有可访问的url。

@Testpublic void testOss(){String endpoint = "oss-cn-beijing.aliyuncs.com"; // 查询阿里云bucketString accessKeyId = "";String accessKeySecret = "";String bucketName = "hemastudy";String objectName = "0001.jpg";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath= "E:\\download\\3bi4.jpg";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObject请求。ossClient.putObject(bucketName, objectName, inputStream);} 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 (Exception 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();}}}

将OSS集成到案例中,将员工图像上传到OSS中。

  • 接收上传的图片

  • 将图片存储起来吗

  • 返回图片访问的url

使用标签展示图片。

实现阿里云上传的工具类,调用上传方法返回url。可将该类加到IOC容器管理,添加注解@Component。注意自己修改endpoint要加上https://

/*** 阿里云 OSS 工具类*/
public class AliOSSUtils {private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";private String bucketName = "web-tlias";/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

使用方法:

    @PostMapping("/upload1")public Result upload(MultipartFile image) throws IOException {String url = aliOSSUtils.upload(image);return Result.success();}

小结:

  • 了解文件上传,文件上传前端页面三要素

  • 服务端接收文件Multipartfile

  • 文件存储

P151、P152 案例-修改员工-查询回显

修改员工两步:先要依据点击的记录请求服务端返回数据用于页面回显展示,保存需要更新数据。

查询回显:按照id进行查询即可。

修改员工采用动态SQL,使用判断是否需要更新。

P153 案例-配置文件-参数配置化

springboot的配置文件。

问题分析,怎样将一些参数的设置进行集中管理?

配置文件一般只有一个,可以考虑将参数定义在配置文件中,kye=value的形式。

如果在类中需要使用这些参数的话,如何读取到?方式是通过IO流来读取配置文件,解析配置文件中的值,然后为类中成员赋值。

上述方法在springboot中已经解决了,提供了一个注解@value,用于外部配置的属性注入,具体用法@value("${配置文件中的key}")

多行编辑,alt+鼠标左键,

例如:

   @Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;@Value("${aliyun.oss.bucketName}")private String bucketName;

P154 案例-配置文件-yml配置文件

springboot中提供了多种属性配置方式:

  • application.properties:key = value的形式

  • application.yml

  • application.yaml ,两者配置形式相同,配置形式为key:value

例如设置内嵌的tomcat端口号修改为9000

server:port: 9000address:

下面是常见的配置文件格式对比:推荐使用yml格式的配置文件

在这里插入图片描述

yml格式的基本语法

  • 大小写敏感

  • 数值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时不允许使用Tab键,只能用空格

  • 缩进的空格数不重要,相同层级的元素左侧对齐

  • #表示注释,

yml中常见的数据格式:

  • 对象/Map集合,例如

user:
name: xxx
age: 12
password: xxx

- 数组/List/Set集合```YAML
hobby:- java- C- game- sport

使用yml配置文件同样可以运行。

P155 案例-配置文件-@Configuration

如果采用value注解注入配置文件中的参数,当比较多的时候则会比较繁琐、臃肿。

springboot中有解决,可以自动将配置文件中的值自动注入到需要的类成员中,注意key需要对应,并且为实体类属性提供get、set方法,并将实体类交给IOC容器管理,如果有前缀则要添加,则前面的aliossutils可以修改为如下形式:

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOssproperties {private String endpoint;private String accessKeyId;private String ccessKeySecret;private String ucketName;
}// 在使用的 时候直接注入bean对象即可

需要引入依赖:自动识别被configurationproperties标识的对象

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>

@ConfigurationProperties与@Value的区别:

在这里插入图片描述

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

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

相关文章

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

JVM-虚拟机栈概述

背景&#xff1a;由于跨平台的设计&#xff0c;java指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器。 栈是运行时单位&#xff0c;而堆是存储的单位。即&#xff1a;栈解决程序运行的问题&#xff0c;即程序如何执行&#xff0c;或者说如何…

JavaWeb——013SpringBootWeb综合案例(事务管理、AOP)

事务&AOP 目录 事务&AOP1. 事务管理1.1 事务回顾1.2 Spring事务管理1.2.1 案例1.2.2 原因分析1.2.3 Transactional注解 1.3 事务进阶1.3.1 rollbackFor1.3.3 propagation1.3.3.1 介绍1.3.3.2 案例 2. AOP基础2.1 AOP概述2.2 AOP快速入门2.3 AOP核心概念 3. AOP进阶3.1 …

ai直播数字人:AI大模型应用开发的神奇世界

当AI技术的发展走向一个新的高峰&#xff0c;AI直播数字人逐渐成为人们关注的焦点。这种全新的数字人形态&#xff0c;通过大模型应用开发&#xff0c;带来了一个神奇世界。 在这个神奇世界里&#xff0c;AI直播数字人可以展现出与真实人类相媲美的外貌和声音。通过先进的图像…

方法中单独使用return关键字

一、return关键字的单独使用 二、示例代码 public class ReturnDemo {public static void main(String[] args) {chu(10,0);chu(10,2);}public static void chu(int a,int b){if (b 0) {System.out.println("除法出错&#xff0c;除数不能为零");return;}System.ou…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

APEX开发过程中需要注意的小细节3

【问题记录】在编辑数据信息时发现辩护的数据无法保存&#xff0c;提示 “ORA-01799: 列不能外部联接到子查询” 仅展示的数据来自主表&#xff0c;这部分都是关联子表重点内容&#xff0c;编辑时无法保存 于是想将扩展表作为主表&#xff0c;在主表进行修改试试 新的报错&a…

C#实现归并排序算法

C#实现归并排序算法 以下是 C# 中的归并排序算法实现示例&#xff1a; using System;class MergeSortAlgorithm {// 合并两个子数组static void Merge(int[] arr, int left, int mid, int right){// 计算左子数组和右子数组的长度int n1 mid - left 1;int n2 right - mid;/…

C语言从入门到精通 第十二章(程序的编译及链接)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…

支小蜜校园防欺凌系统听到声音之后会自动识别吗

在校园安全领域&#xff0c;特别是在预防和应对欺凌问题上&#xff0c;校园防欺凌系统作为新兴的技术应用&#xff0c;正在受到越来越多的关注和探索。那么当这样的系统听到声音之后&#xff0c;它是否能够自动识别并作出相应反应呢&#xff1f;本文将围绕这一问题展开探讨。 …

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏&#xff0c;导致配置文件无法恢复&#xff0c;可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下&#xff0c;设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单&#xff0c;但是存在…

K线实战分析系列之十八:十字线——判断行情顶部的有效信号

K线实战分析系列之十八&#xff1a;十字线——判断行情顶部的有效信号 一、十字线二、十字线总结三、三种特殊十字线四、长腿十字线五、墓碑十字线六、蜻蜓十字线七、特殊十字线总结 一、十字线 重要的反转信号 幅度较大的下跌&#xff0c;出现一根十字线&#xff0c;正好是在…

编译内核错误 multiple definition of `yylloc‘

编译内核错误 # make ARCHarm CROSS_COMPILEarm-mix410-linux- uImageHOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here collect2: error: ld ret…

【Lazy ORM】 小工具 acw 本地客户端 你负责点击页面,他负责输出代码

介绍 wu-smart-acw-client 简称acw-client&#xff0c;是一个基于Lazy ORM定制的客户端代码生成小工具 Lazy ORM 小工具 acw 本地客户端 你负责点击页面&#xff0c;他负责输出代码安装 <dependency><groupId>top.wu2020</groupId><artifactId>wu-sma…

数据结构——lesson7二叉树 堆的介绍与实现

前言&#x1f49e;&#x1f49e; 啦啦啦~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于数据结构顺序表链表有疑问的都可以在上面数据结…

第四届信息通信与软件工程国际会议(ICICSE 2024)即将召开!

2024年第四届信息通信与软件工程国际会议&#xff08;ICICSE 2024&#xff09;将于2024年5月10-12日在中国北京举办。本次会议由北京工业大学、IEEE以及Comsoc 联合主办。随着当今社会信息化的高速发展&#xff0c;电子信息技术的应用更是随处可见。其中&#xff0c;信息通信与…

备份 ChatGPT 的聊天纪录

备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况&#xff0c;让许多用户觉得困扰不已&#xff0c;也担心自己想留存的聊天记录消失不见。 好消息是&#xff0c;OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能&#xff0c;无论是免费…

Redis什么这么快和Redis单线程模型和多线程

概述 1、完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中&#xff0c;类似于HashMap&#xff0c;HashMap的优势就是查找和操作的时间复杂度都是O(1)&#xff1b; 2、数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中…

二叉树入门

这篇博客通过手动创建的一个简单二叉树&#xff0c;实现二叉树遍历&#xff0c;返回节点&#xff0c;叶子个数&#xff0c;查找结点等相关操作。 1. 二叉树的概念 二叉树不为空时&#xff0c;由根节点&#xff0c;左/右子树组成&#xff0c;逻辑结构如下&#xff0c;当二叉树…