当前位置: 首页 > news >正文

Spring MVC(五) 文件上传

1 单文件上传

        在程序开发中,有时候需要上传一些文件。我们在学习Servlet的时候,也做过文件上传的操作,只不过基于Servlet的文件上传操作起来过于复杂,因此所有的MVC框架都提供了自己的文件上传操作,基本上都是基于FileUpload的文件上传。

        Spring MVC在处理文件上传的时候,有自己的处理方法,但是也是基于FileUpload的操作,因此在处理文件上传的时候也需要导入commons-fileupload-1.2.2.jar包和commons-io-2.4.jar包。

        在操作的时候,首先需要在配置文件中,配置Spring MVC文件上传功能,具体代码如下。

<!-- 设置了multipartResolver才能完成文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 文件上传字符编码 --><property name="defaultEncoding" value="UTF-8"></property><!-- 设置文件上传的大小,单位是字节 --><property name="maxUploadSize" value="2000000"></property>
</bean>

        接下来需要一个表单,用来执行选择文件操作,首先在控制器中添加方法,用来跳转到文件上传页面,具体代码如下。

@RequestMapping(value="/uploadInput", method=RequestMethod.GET)
public String upload() {return "upload";
}

        在WEB-INF/jsp目录下创建upload.jsp页面,并添加如下代码。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name"><br>file:<input type="file" name="fileName"><br><input type="submit" value="提交">
</form>

        页面效果如图所示。

        在控制器中只需要在处理方法中加入参数MultipartFile,就可以实现文件上传了。编写处理方法,代码内容如下。

@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile file, HttpServletRequest req) {System.out.println(name);//获取表单域的名字System.out.println(file.getName());//获取文件原始的名字System.out.println(file.getOriginalFilename());//获取文件的类型System.out.println(file.getContentType());//获取文件上传的路径String realpath = req.getSession().getServletContext().getRealPath("/upload");//创建文件对象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上传
FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "upload";
}

        注意:方法中MultipartFile对象的名字,必须和文件表单域的名字一致,否则会报错。

        在WebRoot目录下创建文件夹upload,访问:http://localhost:8080/springmvc/uploadInput,选择文件,就可以正常上传文件了。

2 多文件上传

        在实际的开发中,有时要同时上传多个文件,在处理的时候,只需要稍作修改就可以了。首先需要修改文件上传页面代码,如下所示。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br><input type="submit" value="提交">
</form>

        页面显示的效果如图所示。

        在控制器中的处理也非常简单,只需要把对象改为一个数组即可,代码修改如下。

@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile files[], HttpServletRequest req) {//获取文件上传的路径String realpath = req.getSession().getServletContext().getRealPath("/upload");for(MultipartFile file:files) {//在多文件上传时,防止有的文件表单域没有选择文件if(file.isEmpty()) {continue;}//创建文件对象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上传	 FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "success";
}

        此时选择多个文件,也能同时完成上传,即使有的表单域没有选择文件,也是可以的,同时这种方法同样也能完成单文件的上传。不过这样做也有点费事,在实际开发中往往都是通过插件,使在一个选择框中,可以同时选择若干文件,实现同时上传。这一点在HTML5中,可以通过multiple属性来实现在一个文件表单域中可接受多个值的文件上传,在HTML4中仍然可以使用,具体代码如下所示。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files" multiple="multiple"><br><br><input type="submit" value="提交">
</form>

        页面效果如图所示。

        后台接收文件的处理代码不用修改,可以直接使用。

相关文章:

Spring MVC(五) 文件上传

1 单文件上传 在程序开发中&#xff0c;有时候需要上传一些文件。我们在学习Servlet的时候&#xff0c;也做过文件上传的操作&#xff0c;只不过基于Servlet的文件上传操作起来过于复杂&#xff0c;因此所有的MVC框架都提供了自己的文件上传操作&#xff0c;基本上都是基于File…...

Redis——Redis数据分片的三种算法

Redis的数据分片通常是为了实现水平扩展&#xff0c;将数据分散到多个Redis节点上&#xff0c;以提高系统的容量和性能。在Redis的不同实现和集群方案中&#xff0c;数据分片的算法有所不同。以下是Redis数据分片的三种常见算法&#xff1a; 哈希取模分片&#xff08;Hash Modu…...

【专利】一种日志快速分析方法、设备、存储介质

公开号CN116560938A申请号CN202310311478.5申请日2023.03.28 是我在超音速人工智能科技股份有限公司(833753) 职务作品&#xff0c;第一发明人是董事长夫妇&#xff0c;第二发明人是我。 ** 注意** &#xff1a; 内容比较多&#xff0c;还有流程图、界面等。请到 专利指定页面…...

HFSS学习-day5-边界条件

边界条件 概述边界条件类型1、理想导体边界条件&#xff08;Perfect E&#xff09;2、理想磁边界条件&#xff08;Perfect H&#xff09;3、有限导体边界条件&#xff08;Finite Conductivity&#xff09;4、辐射边界条件&#xff08;Radiation&#xff09;5、对称边界条件&…...

spring Aop使用示例

简介&#xff08;aop作用&#xff09;&#xff1a;1.在不改变源代码的基础上进行功能添加&#xff0c;如日志打印、执行时间统计。2.与代理效果类似但更加便捷。 示例&#xff1a; maven依赖&#xff1a; <dependency><groupId>org.springframework</groupId&g…...

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式&#xff0c;索引信息以及数据记录都保存在数据文件或索引文件中&#xff08;本质存储在页结构中&#xff09; 1.1、磁盘与内存交互的基本单位&#xff1a;页 在InnoDB中将数据划分为若干页&#xff0c;页的默认大小为&#xff…...

【吊打面试官系列】Java高并发篇 - 什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是 Java Timer 类&#xff1f;如何创建一个有特定时间间隔的任务&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是 Java Timer 类&#xff1f;如何创建一个有特定时间间隔的任务&#xff1f; java.util.T…...

Spring生命周期深度解析

Spring生命周期深度解析 介绍 Spring是一个开源的Java框架&#xff0c;用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&#xff0c;而不必过多关注底层的技术细节。 在使用Spring框架开发应用程序时…...

基于 Windows 的记事本简单功能开发及部署发布--迭代2.0

基于上篇文章基于 Windows 的记事本简单功能开发-CSDN博客 更新完成以下几个功能点&#xff1a; 1.中心部件更改为栅格布局 2.另存为功能&#xff1a; 打开文本保存框,用户选中文件保存时 得到绝对路径。 判断用户选择路径不为空。 得到用户输入内容。 创建文件对象&…...

Java lambda

forEach 比 for 语句的线程安全要求更严格。 如此语句使用for语句可以&#xff0c;但是forEach却不可以。...

【智能算法】河马优化算法(HO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;MH Amiri受到自然界河马社会行为启发&#xff0c;提出了河马优化算法&#xff08;Hippopotamus Optimization Algorithm, HO&#xff09;。 2.算法原理 2.1算法思想 …...

spring基础使用(案例)

基于xml使用&#xff1a; 准备&#xff1a; 1.Dao层&#xff08;接口&#xff09;&#xff1a; public interface UserDao {public void save(); } 1.1 Dao层&#xff08;实现类&#xff09;&#xff1a; public class UserDaoIim implements UserDao {Overridepublic vo…...

相同的树LeetCode

100. 相同的树 - 力扣&#xff08;LeetCode100. 相同的树 - 力扣&#xff08; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 /*** Definition…...

Vue中如何抽取部分代码到单独的ts文件

Vue中如何抽取部分代码到单独的ts文件 本文代码基于 简单示例 这段代码&#xff0c;是比较通用的代码&#xff0c;我想抽取成一个ts文件&#xff0c;来供其他地方调用。 const groupData reactive({groupList:[] as Array<GroupV2Response>,current:{} as GroupV2Re…...

山东齐鲁文化名人颜廷利:朱郭有文才,曲高‘菏’寡星光路

山东齐鲁文化名人颜廷利教授表示&#xff0c;朱郭&#xff08;谐音‘祖国’&#xff09;有文才&#xff0c;《曲高‘菏’寡》星光路… 山东菏泽歌手朱之文在2011年凭借一首《滚滚长江东逝水》一夜成名&#xff0c; 十多年之后的今天&#xff0c;菏泽市网络红人郭有才靠一首《诺…...

嵌入式学习70-复习(wireshark使用和http协议)

知识零碎&#xff1a; ssize_t 头文件&#xff1a;<sys/types.h> 有符号整型 --------------------------------------------------------------------------------------------------------------------------------- wireshark 1.sudo wireshark 2.选择 any &…...

idea配置MySQL提示

点击sql语句&#xff0c;然后再选择show context actions 然后再选择Inject language or reference 然后再选择MySQL 然后我们会发现sql语句变颜色了 如果表是红色 那么需要我们连接mysql的对于的数据库...

如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…...

速盾:怎么设置cdn加速小程序图片?

小程序是一种基于微信平台的应用程序&#xff0c;为了提升小程序的用户体验&#xff0c;我们可以通过设置CDN&#xff08;内容分发网络&#xff09;来加速小程序中的图片加载速度。CDN是一种分布式服务&#xff0c;它将原始服务器的存储内容复制到在全球各地的缓存服务器&#…...

Android bootchart 分析启动性能工具使用

bootchart简介 bootchart 可为整个系统提供所有进程的 CPU 和 I/O 负载细分。该工具不需要重建系统映像&#xff0c;可以用作进入 systrace 之前的快速健全性检查。 1. 板端配置&#xff1a; 在Android 板端启用 bootchart&#xff0c;请运行以下命令&#xff1a; 2. Bootch…...

C++ 硬件特征自适应分发:利用 C++ 特性实现对不同 CPU 指令集(AVX2/AVX-512)的运行时代码路径最优选择

C 硬件特征自适应分发&#xff1a;运行时代码路径最优选择各位技术爱好者&#xff0c;大家好&#xff01;在现代高性能计算领域&#xff0c;充分挖掘硬件潜力是提升程序性能的关键。我们知道&#xff0c;CPU架构在不断演进&#xff0c;其指令集也在持续扩展&#xff0c;以支持更…...

深入解析Flash芯片测试:从基础操作到高级模式切换

1. Flash芯片测试基础入门 第一次接触Flash芯片测试时&#xff0c;我也被各种专业术语搞得晕头转向。经过几个项目的实战&#xff0c;我发现只要掌握几个核心概念&#xff0c;就能快速上手。Flash芯片和我们平时用的U盘、SSD本质上是一类东西&#xff0c;但测试时需要关注的点…...

如何使用unbuild在5分钟内搭建现代化JavaScript项目:终极快速指南

如何使用unbuild在5分钟内搭建现代化JavaScript项目&#xff1a;终极快速指南 【免费下载链接】unbuild &#x1f4e6; A unified JavaScript build system 项目地址: https://gitcode.com/gh_mirrors/un/unbuild 在当今快速发展的JavaScript生态系统中&#xff0c;构建…...

实战演练:基于快马平台快速构建kafka电商用户行为分析系统

实战演练&#xff1a;基于快马平台快速构建Kafka电商用户行为分析系统 最近在做一个电商数据分析项目&#xff0c;需要实时追踪用户的点击和浏览行为。经过调研发现&#xff0c;Kafka作为分布式消息队列非常适合这种高吞吐量的场景。下面分享我是如何用InsCode(快马)平台快速搭…...

AGI能力边界与安全约束

AGI能力边界与安全约束&#x1f4dd; 本章学习目标&#xff1a;通过本章学习&#xff0c;你将全面掌握"AGI能力边界与安全约束"这一核心主题&#xff0c;建立系统性认知。一、引言&#xff1a;为什么这个话题如此重要 在人工智能快速发展的今天&#xff0c;AGI能力边…...

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径

entr 社区贡献终极指南&#xff1a;从新手到核心开发者的快速成长路径 【免费下载链接】entr Run arbitrary commands when files change 项目地址: https://gitcode.com/gh_mirrors/en/entr entr 是一款轻量级文件变化监控工具&#xff0c;能够在文件发生变化时自动执行…...

高效办公隐私保护工具:Boss-Key老板键一键隐藏窗口解决方案

高效办公隐私保护工具&#xff1a;Boss-Key老板键一键隐藏窗口解决方案 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在现代办公环境中&…...

告别激光雷达?手把手复现ST-P3:一个纯视觉的端到端自动驾驶模型(附避坑指南)

纯视觉自动驾驶实战&#xff1a;从零复现ST-P3模型的完整指南 当特斯拉在2021年宣布取消所有车型的雷达传感器时&#xff0c;整个行业都在质疑纯视觉方案的可靠性。然而ST-P3论文的发表&#xff0c;为这一技术路线提供了新的理论支撑。本文将带你深入这个前沿模型的实现细节&am…...

Arduino非阻塞编程:Pin与WaitDo轻量级嵌入式工具库

1. 项目概述HDW-Utils 是一个面向 Arduino 平台的轻量级嵌入式工具库&#xff0c;其核心设计目标并非提供底层硬件驱动&#xff0c;而是解决嵌入式开发中高频出现的代码重复性、结构松散性与阻塞式延时滥用三大工程痛点。该库以“硬件开发者的实用主义”为出发点&#xff0c;通…...

SEO_详解SEO优化中站内与站外优化的区别

SEO优化中站内与站外优化的区别详解 在当今的网络世界&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是每一个网站主人都必须掌握的技能。SEO优化主要分为站内优化和站外优化&#xff0c;两者在策略和目标上有着显著的区别。本文将详细解析这两者的区别&#xff0c;并为…...