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,一经查实,立即删除!

相关文章

LeetCode 2894. 分类求和并作差

给你两个正整数 n 和 m 。 现定义两个整数 num1 和 num2 &#xff0c;如下所示&#xff1a; num1&#xff1a;范围 [1, n] 内所有 无法被 m 整除 的整数之和。 num2&#xff1a;范围 [1, n] 内所有 能够被 m 整除 的整数之和。 返回整数 num1 - num2 。 示例 1&#xff1a; …

vector的定义与遍历

一、vector的定义&#xff1a; 1、导入#include 2、vector<数据类型> 变量名 3、赋值方式&#xff1a; 变量名.push_back(); #include<iostream> #include<vector> #include<algorithm> using namespace std; void test02(int val){cout << val…

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 组织开发…

文件包含漏洞讲解

文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能。 基础编辑 本地文件包含 常见的文件包含漏洞的形式为 <?php include("inc/" . $_GET[file]); ?> 考虑常用的几种包含方式为 同目录包含file.htaccess目录遍历?file…/…/…/…/…/……

RabbitMQ安装和使用

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

JavaSE核心基础-循环嵌套-笔记

1.循环嵌套概述 循环嵌套&#xff1a;一个循环体内包含了另一个完整的循环结构&#xff0c;那么总共的循环次数 外循环次数 * 内循环次数。 2.循环嵌套分类 语法&#xff1a; for(初始化表达式①; 循环条件②; 步进表达式⑦) { for(初始化表达式③; 循环条…

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…

Vue动态添加新的属性到实例上(vue的问题)

当我们去看vue文档的时候&#xff0c;发现如果在实例创建之后添加新的属性到实例上&#xff0c;它不会触发视图更新。比如我们我们开始创建了一个对象实例&#xff0c;在实例创建之后为其增加新的属性&#xff0c;我们发现这个属性不能生效,此时需要使用this.$set()方法。 &…

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…

【图论】树的直径

树的直径即为一棵树中距离最远的两点之间的路径 方法一&#xff1a;DFS 先以任意一点为起点跑一遍dfs&#xff0c;记录离起点距离最远的点p&#xff08;这个点一定是直径的一个端点&#xff0c;感性理解一下不证明了&#xff09;&#xff0c;然后再以最远点再跑一遍dfs&#…

代码随想录算法训练营第三十七天| 738.单调递增的数字、968.监控二叉树

代码随想录算法训练营第三十七天| 738.单调递增的数字、968.监控二叉树 题目 738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且…

【导航】繁星学习随想录

导航&#xff1a;繁星学习随想录 一、编程启示录 01 数据结构漫谈 序号博文名称/链接01扁扁笨算法-AVL树的插入与删除02扁扁笨算法-B树的插入与删除 02 概念小扫盲 序号博文名称/链接01简单理解决策树_如何理解决策树的生长过程-CSDN博客02白盒测试方法与黑盒测试方法简析…

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 计划资源…