Spring MVC(五) 文件上传

news2024/11/25 4:41:11

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 block
		e.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 block
			e.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>

        页面效果如图所示。

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

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

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

相关文章

SpringCloud微服务01-MybatisPlus-Docker

https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec 一、微服务介绍 单体架构所有功能集群在一个架构中&#xff0c;难以维护复杂需求 微服务之间是不同的TomCat要跨服务查询&#xff0c; 学习是如何拆分单体架构为微服务 二、MybatisPlus 1.快速入门 ①入门…

Win10弹出这个:https://logincdn.msauth.ne

问题描述&#xff1a; Win10脚本错误 Windows10家庭版操作系统开机后弹出这个 https://logincdn.msauth.net/shared/1.0/content/js/ConvergedLogin_PCore_vi321_9jVworKN8EONYo0A2.js 解决方法&#xff1a; 重启计算机后手动关闭第三方安全优化软件&#xff0c;然后在任务管理…

强化学习——马尔可夫过程的理解

目录 一、马尔可夫过程1.随机过程2.马尔可夫性质3.马尔可夫过程4.马尔可夫过程示例 参考文献 一、马尔可夫过程 1.随机过程 随机过程是概率论的“动态”版本。普通概率论研究的是固定不变的随机现象&#xff0c;而随机过程则专注于那些随时间不断变化的情况&#xff0c;比如天…

OpenHamrony 实战开发——LiteOS-M内核的中断管理

在程序运行过程中&#xff0c;当出现需要由CPU立即处理的事务时&#xff0c;CPU暂时中止当前程序的执行转而处理这个事务&#xff0c;这个过程叫做中断。当硬件产生中断时&#xff0c;通过中断号查找到其对应的中断处理程序&#xff0c;执行中断处理程序完成中断处理。 通过中…

Ubuntu安装VScode

Ubuntu安装VScode 前言&#xff1a; 1、Ubuntu安装VScode比较方便 2、我更喜欢source insight 1、获取到linux版本的VScode安装包 VSCode 下载地址是&#xff1a;https://code.visualstudio.com/ 2、得到安装包 3、复制到ubuntu中&#xff0c;使用命令安装 sudo dpkg -i cod…

jmeter分布式集群压测

目的&#xff1a;通过多台机器同时运行 性能压测 脚本&#xff0c;模拟更好的并发压力 简单点&#xff1a;就是一个人&#xff08;控制机controler/调度机 master&#xff09;做一个项目的时候&#xff0c;压力有点大&#xff0c;会导致结果不理想&#xff0c;这时候找几个人&a…

国际护士节庆祝活动向媒体投稿有方法很轻松

作为一名医院职工,我肩负着医院对外信息宣传的重任。在国际护士节这个特殊的日子里,我们医院举办了一系列庆祝活动,以表彰护士们的辛勤付出和无私奉献。然而,在将这些活动信息投稿至媒体的过程中,我最初却遭遇了诸多挑战。 起初,我采用传统的邮箱投稿方式,将精心撰写的稿件发送…

Docker运行出现iptables: No chain/target/match by that name报错如何解决?

在尝试重启 Docker 容器时遇到的错误信息表明有关 iptables 的配置出了问题。这通常是因为 Docker 需要配置网络&#xff0c;而 iptables 规则没有正确设置或被意外删除。具体到你的错误信息中&#xff0c;报错 iptables: No chain/target/match by that name 表示 Docker 尝试…

Java后端的接口参数两个interger 类型情况解决

get请求 &#xff0c;对应请求头 RequestParm, post请求&#xff0c; 对应请求体 &#xff0c;RequestBody 两个Integer参数情况 GetMapping("/insertStaffClass")public R<Void> insertStaffClass(RequestParam Integer staffId,RequestParam List<Integ…

Floyd+二分,蓝桥杯国赛2022[环境治理]

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0环境治理 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 考虑我们治理时间越长&#xff0c;灰尘度和越低&#xff0c;具有单调性 考虑 二分治理天数mid&#xff0c;1~n可以降低与其相连边 mid / n 点…

PyQt5中的QGraphicsView()

文章目录 1. 简介2. 一个简单的示例2. 加载一幅图片3. 常用方法示例 1. 简介 QGraphicsView是PyQt5中用于显示图形场景的小部件&#xff0c;它提供了许多常用的方法来控制视图的行为和属性。下面是一些常用的QGraphicsView方法&#xff1a; setScene(scene): 设置要显示的场景…

初识C语言——第十九天

for循环 1.简单概述 2.执行流程 3.建议事项&#xff1a;

vue从入门到精通(一):初始Vue

一&#xff0c;Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代…

长难句打卡 5.13

And in Europe, some are up in arms over a proposal to drop a specific funding category for social-science research and to integrate it within cross-cutting topics of sustainable development. 在欧洲&#xff0c;有些人正竭力反对一项“终止专用于社会科学研究的…

java spring boot动态数据库获得配置信息连接多数据源(数据库)

数据库 数据库文件和代码文件 https://download.csdn.net/download/qq_34631220/89304173 链接&#xff1a;https://pan.baidu.com/s/1xoh6xiSRx4nW_gKvR1QPjg 提取码&#xff1a;i7b7 –来自百度网盘超级会员V5的分享 文章位置 添加链接描述 说明&#xff1a;事务只能单库…

JUC下的Future 详解

java.util.concurrent.Future 是Java并发编程中一个重要的接口&#xff0c;它代表一个异步计算的结果。当你提交一个任务到执行器&#xff08;如ExecutorService的submit方法&#xff09;&#xff0c;它会返回一个Future对象。这个对象允许你查询任务是否完成、取消任务、获取任…

软件需求工程习题

1.&#xff08;面谈&#xff09;是需求获取活动中发生的需求工程师和用户间面对面的会见。 2.使用原型法进行需求获取&#xff0c;&#xff08;演化式&#xff09;原型必须具有健壮性&#xff0c;代码质量要从一开始就能达到最终系统的要求 3.利用面谈进行需求获取时&#xf…

vue3使用依赖注入实现跨组件传值

父组件Index.vue: <script setup> import { onMounted, provide, ref } from vue import Child from ./Child.vue import ./index.cssconst count ref(0)provide(count, count)const handleClick () > {count.value }onMounted(() > {}) </script><tem…

基于SpringBoot + MySQL的宠物医院管理系统设计与实现+毕业论文+指导搭建视频

系统介绍 项目的使用者可以避免排队挂号&#xff0c;比较方便&#xff0c;也方便于宠物医院的管理。现在的宠物本系统根据华阳社区宠物医院管理工作流程将系统使用者划分为三类&#xff0c;分别为、宠物医生、宠物主人以及系统管理人员&#xff0c;以下是对该三类类用户的具体…

基于百川大语言模型的RSS新闻过滤应用【云服务器+公网网页,随时随地看自己DIY订阅的新闻内容】

背景 目前从公众号、新闻媒体上获得的新闻信息,都是经过算法过滤推荐的,很多时候会感到内容的重复性和低质量,因为他们也要考虑到自己的利益,并非完全考虑用户想要的、对用户有价值的信息。这时,如果要获取自己认为重要的信息,定制化开发自己的筛选算法更好。 效果 素材…