Spring Web文件上传功能简述

文章目录

  • 正文
    • 简单文件上传
    • 文件写入
  • 总结

正文

在日常项目开发过程中,文件上传是一个非常常见的功能,当然正规项目都有专门的文件服务器保存上传的文件,实际只需要保存文件路径链接到数据库中即可,但在小型项目中可能没有专门的文件服务器用来存储这些文件,这时就需要我们自己手动实现文件上传功能了。

简单文件上传

在SpringWeb项目中要想实现文件上传也很简单,通过接收 MultipartFile类型的文件即可接收到文件参数,一个简单的文件上传Controller接口代码如下

@RestController
@RequestMapping("/test")
public class TestController {@CrossOrigin@PostMapping("/file")public String testFileUpload(MultipartFile file){String oriName = file.getOriginalFilename();return "已收到上传文件:"+oriName;}
}

这时只需要前端通过<input type="file"/>标签获取文件并使用FormData的方式上传即可,简单代码如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>FileUploadDoc</title><style>.contain{margin-left: 300px;margin-top: 100px;border: blanchedalmond solid;width: 310px;padding: 10px;}</style>
</head>
<body>
<div class="contain"><input id="uploadedInput" type="file" name="uploadedFile"><button id="submitBtn">提交</button>
</div>
</body>
<script>let btn = document.getElementById("submitBtn")let fileInput = document.getElementById("uploadedInput")btn.addEventListener("click",()=>{let fileData=fileInput.files[0]let formData = new FormData()formData.append("file",fileData)//注意:这里不需要设置Content-Type参数let xhr = new XMLHttpRequest();xhr.open("POST","http://localhost:18080/test/file")xhr.send(formData)xhr.onreadystatechange=()=>{if (xhr.status===200){console.log(xhr.responseText)}}})
</script>
</html>

效果如下

在这里插入图片描述

选择文件后,通过点击提交按钮即可将所选文件上传到后端服务器。

这里有一个问题需要注意,如果上传失败报错,需要设置

  1. 最大文件大小,参数名spring.servlet.multipart.max-file-size,默认值1MB

  2. 单个请求最大值 ,参数名spring.servlet.multipart.max-request-size,默认值10MB

这两个参数,在SpringBoot项目中由于存在默认配置,可以不设置,若需要修改默认值则需根据实际情况设置这两个参数。

如果超出尺寸大小的限制会抛出这两个异常

  1. 文件大小超出限制异常为 FileSizeLimitExceededException
  2. 请求内容超出限制异常为 SizeLimitExceededException

文件写入

一般情况下的上传业务,需要将文件写入到固定的文件夹下,而当遇到同名文件时需要覆盖原来的文件。面对这种业务逻辑需要修改代码如下

@CrossOrigin
@PostMapping("/file")
public String testFileUpload(MultipartFile file) throws IOException {if (file == null) {return "上传文件不能为空";}//获取文件名String oriName = file.getOriginalFilename();//文件保存文件夹String dirPath = "D:\\Activities\\temp_files";File serverFile = new File(dirPath, oriName);//判断文件是否存在if (serverFile.exists()) {serverFile.delete();} else {serverFile.createNewFile();}//读取文件并上传try (InputStream input = file.getInputStream();BufferedInputStream bIn = new BufferedInputStream(input);OutputStream output = new FileOutputStream(serverFile);BufferedOutputStream bOut = new BufferedOutputStream(output)) {byte[] byteArr = new byte[1024];int len = 0;while ((len = bIn.read(byteArr)) > 0) {bOut.write(byteArr, 0, len);}}return "已收到上传文件:" + oriName;
}

另一种常见的业务逻辑是,校验文件格式(如:只支持txt文件格式)后,对其进行重命名后返回一个网络地址,这时可使用以下代码

@CrossOrigin
@PostMapping("/file")
public String testFileUpload(MultipartFile file) throws IOException {if (file == null) {return "上传文件不能为空";}StringBuffer fileNameBuf = new StringBuffer();fileNameBuf.append(System.currentTimeMillis()).append(UUID.randomUUID());String oriName = file.getOriginalFilename();//校验.txt和.TXT文件格式Pattern pattern = Pattern.compile("^.+[.txt|.TXT]$");if(pattern.matcher(oriName).matches()) {fileNameBuf.append(".txt");}else{return "文件格式错误,只支持txt文件";}String dirPath = "D:\\Activities\\temp_files";File serverFile = new File(dirPath, fileNameBuf.toString());if (serverFile.exists()) {return "文件上传失败,请重试";} else {serverFile.createNewFile();}try (InputStream input = file.getInputStream();BufferedInputStream bIn = new BufferedInputStream(input);OutputStream output = new FileOutputStream(serverFile);BufferedOutputStream bOut = new BufferedOutputStream(output)) {byte[] byteArr = new byte[1024];int len = 0;while ((len = bIn.read(byteArr)) > 0) {bOut.write(byteArr, 0, len);}}//生成网络链接StringBuffer webPath = new StringBuffer("文件上传成功,文件访问链接为:");webPath.append("https://img.sunyog.top/temp_files/").append(fileNameBuf);return webPath.toString();
}

总结

本文简单介绍了在Spring Web项目中文件上传相关的业务,在Spring中文件上传通过接收 MultipartFile类型的参数即可实现,获取到文件后可根据具体的业务逻辑进行相应处理。而在JavaScript中需要做的仅仅是获取所选文件,并通过FormData传输数据即可。


📩 联系方式
邮箱: qijilaoli@foxmail.com
掘金: https://juejin.cn/user/873463590162108
CSDN: https://blog.csdn.net/qq_43408971

❗版权声明
本文为原创文章,版权归作者所有。未经许可,禁止转载。更多内容请访问我的个人中心

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

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

相关文章

Oracle命令大全

文章目录 1. SQL*Plus命令&#xff08;用于连接与管理Oracle数据库&#xff09;2. SQL数据定义语言&#xff08;DDL&#xff09;命令3. SQL数据操作语言&#xff08;DML&#xff09;命令4. PL/SQL程序块5. 系统用户管理6. 数据备份与恢复相关命令1. SQL*Plus命令&#xff08;用…

西门子燃烧控制器维修LMV37.410A2WH

西门子燃烧控制器维修范围包括&#xff1a; LMV系列燃烧器控制系统维修 LMV5系列控制器维修 AZL系列显示操作单元维修 QRI系列火焰探测器维修 SQM4系列电动执行机构维修 AZL系列或其他控制系统维修或设置燃烧器的启停&#xff0c;燃料&#xff0c;运行模式&#xff0c;运行…

基于网络爬虫的微博热点分析,包括文本分析和主题分析

基于Python的网络爬虫的微博热点分析是一项技术上具有挑战性的任务。我们使用requests库来获取微博热点数据&#xff0c;并使用pandas对数据进行处理和分析。为了更好地理解微博热点话题&#xff0c;我们采用LDA主题分析方法&#xff0c;结合jieba分词工具将文本分割成有意义的…

配置zabbix平台对数据库以及主从状态的监控

引言&#xff1a;明人不说暗话&#xff0c;今天分享下配置zabbix平台对数据库以及主从状态的监控 准备好zabbix监控平台&#xff08;zabbix-server端&#xff09;例10.12.153.235 db1客户端&#xff08;zabbix-agent&#xff09;例10.12.153.73 1.安装Zabbix存储库 # rpm -Uv…

PDF.js - 免费开源的 JavaScript 读取、显示 PDF 文档的工具库,由 Mozilla 开发并且持续维护

最近新项目需要处理 PDF&#xff0c;研究了 PDf.js 之后觉得很不错&#xff0c;于是写篇文章推荐给大家。 PDF.js 的功能和它的名字一样简单&#xff0c;是一个使用 HTML5 技术来让前端网页支持读取、解析和显示 PDF 文档的 JS 工具库。这个项目由大名鼎鼎的 Mozilla 组织开发…

RabbitMQ安装和使用

简介 RabbitMQ是一套开源&#xff08;MPL&#xff09;的消息队列服务软件&#xff0c;是由LShift提供的一个Advanced Message Queuing Protocol (AMQP) 的开源实现&#xff0c;由以高性能、健壮以及可伸缩性出名的Erlang写成。所有主要的编程语言均有与代理接口通讯的客户端库…

SQL Server中数据表的增删查改

文章目录 一、增二、查三、改四、删除 一、增 进行增删查改的前提需要在指定数据库中创建数据表&#xff0c;对这块不大理解的可以先看看前面几期文章&#xff1a; 创建数据库 创建数据表 use StudentManageDB go insert into Students (StudentName,Gender,Birthday,Age,Stu…

HarmonyOS【应用服务开发】在模块中添加Ability

Ability是应用/服务所具备的能力的抽象&#xff0c;一个Module可以包含一个或多个Ability。应用/服务先后提供了两种应用模型&#xff1a; FA&#xff08;Feature Ability&#xff09;模型&#xff1a; API 7开始支持的模型&#xff0c;已经不再主推。Stage模型&#xff1a;AP…

C# new Thread和Task.Run,多线程(Thread和Task)

一、开启多线程-new Thread的使用 示例一 Thread thread25yi new Thread(new ThreadStart(obj.MethodTimer1)); thread25yi.Start(); void MethodTimer1() { while (true) { Console.WriteLine(DateTime.Now.ToString() "_" thread25yi.CurrentThread.Managed…

杂记 | 在Linux上使用Docker-compose安装单机版Milvus向量数据库并配置访问控制和可视化面板(Attu)

文章目录 01 Milvus向量数据库简介02 安装前的准备03 安装3.1 创建milvus工作目录3.2 下载并编辑docker-compose.yml3.3 下载milvus.yml文件3.4 启动milvus 04 访问可视化面板并修改密码 01 Milvus向量数据库简介 Milvus是一款开源的向量数据库&#xff0c;它专为AI应用设计&a…

Docker(三)使用 Docker 镜像:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 使用 Docker 镜像 在之前的介绍中&#xff0c;我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源

目录 一、实验 1.环境 2.Terraform查看版本 3.Linux主机安装Docker 4.Terraform使用本地编译&#xff08;In-house&#xff09;的Providers 5.Docker-CE 开启远程API 6. Linux主机拉取镜像 7.Terraform 使用 dynamic动态内联块 创建资源 二、问题 1.Terraform 计划资源…

精品基于Uniapp+springboot校园学校趣事管理系统app

《[含文档PPT源码等]精品基于Uniappspringboot趣事管理系统app》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot &#xff1a;哪个游戏引擎更适合你&#xff1f; 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来&#xff0c;Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较&#xff0c;以期为开发者提供正确的选择建议。 Godot和Unity都有…

Backtrader 文档学习-Indicators混合时间框架

Backtrader 文档学习-Indicators混合时间周期 1.不同时间周期 如果数据源在Cerebro引擎中具有不同的时间范围和不同的长度&#xff0c;指示器将会终止。 比如&#xff1a;data0是日线&#xff0c;data1是月线 。 pivotpoint btind.PivotPoint(self.data1) sellsignal self…

IMDB电影评论的情感分析——paddle

项目地址&#xff1a;IMDB电影评论的情感分析 - 飞桨AI Studio星河社区 (baidu.com) 1. 实验介绍 1.1 实验目的 理解并掌握循环神经网络的基础知识点&#xff0c;包括模型的时序结构、模型的前向传播、反向传播等掌握长短时记忆网络LSTM和门控循环单元网络GRU的设计原理熟悉如…

Halcon基于形变的模板匹配

Halcon基于形变的模板匹配 形变分为两种&#xff0c;一种是基于目标局部的形变&#xff0c;另一种是由于透视关系而产生的形变。基于形变的模板匹配也是一种基于形状的匹配方法&#xff0c;但不同的是&#xff0c;其返回结果中不仅包括轻微形变的形状.形变的位置和参数&#x…

Node.js基础知识点(五)- http

一.request 请求事件处理函数 var http require(http)var server http.createServer() request 请求事件处理函数&#xff0c;需要接收两个参数&#xff1a; Request 请求对象 请求对象可以用来获取客户端的一些请求信息&#xff0c;例如请求路径 Response 响应对象 响应对…

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块&#xff0c;但是yakit也是可以爆破的&#xff0c;并且更好用&#xff08;个人感觉&#xff09;。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

Verilog基础:强度建模(二)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 三、拥有单个强度和确定值的net型信号的线与组合&#xff08;线网多驱动&#xff09; 首先来说明一下什么叫信号拥有单个强度和确定值&#xff0c;其实如果一个ne…