前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC文件上传: MultipartResolver接口

SpringMVC文件上传: MultipartResolver接口

作者头像
Java_慈祥
发布2024-08-06 13:16:17
1320
发布2024-08-06 13:16:17
举报
文章被收录于专栏:SSM专栏Web前后端、全栈出发

SpringMVC 实现文件上传:

单文件上传:

SpringMVC 为文件上传提供了直接的支持, 即 MultipartResolver接口 MultipartResolver接口

用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作 两个实现类 StandardServletMultipartResolver : 使用了Servlet3.0标准的上传方式 CommonsMultipartResolver : 使用了Apache的commons-fileupload来完成具体的上传操作 ( 本篇以此)

省略了SpringMvc的配置:

导入 Jar文件 我们需要Apache 组件, 需要导入两个Jar 组件 commons-io-2.4.jar commons-fileupload-1.2.2.jar

配置MultipartResolver ( 在SpringMVC的核心配置文件中; ) 使用CommonsMultipartResolver配置一个MultipartResolver解析器

代码语言:javascript
复制
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize"   value="500000" ></property>
	<property name="defaultEncoding" value="UTF-8" />
</bean>
<!-- 
	defaultEncoding	: 请求的编码格式,默认为 ISO-8859-1; 一般设为UTF-8 (defaultEncoding必须和JSP的pageEncoding 设置一致,以便正确读取表单内容)
	maxUploadSize	: 设置文件上传的大小限制,单位为字节;
 -->

编写文件上传的表单页 (JSP HTML…)

代码语言:javascript
复制
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>	<!-- pageEncoding="UTF-8" 与MultipartResolver文件上传解析编码设置一致 -->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  
  <body>
  
	<!-- 
		action="myupload" 				: Springmvc控制器接收的名
		method="post" 					: 提交方式,文件上传必须是 post; get存储太小了且不安全;
		enctype="multipart/form-data"	: 必须,指定表单内容类型,支持文件上传;
	 -->  
	<form action="myupload" method="post" enctype="multipart/form-data">
	
		<p>	 <input type="text" name="name">	</p>		<!-- 模拟上传人 -->
		
		<p>  <input type="file" name="myfile">  </p>		<!-- 上传文件:用来上传文件的file组件 -->
			
		</p> <input type="submit" value="上传"> </p>			<!-- 提交 -->
	</form>
	
  </body>
</html>
  1. 编写控制器操作
代码语言:javascript
复制
	@RequestMapping("/myupload")
	public String myupload(String name,@RequestParam("myfile") MultipartFile myfile,HttpSession session) {
		/*	
		 * String name 									:页面给的用户名;
		 * @RequestParam("myfile") MultipartFile myfile :文件参数,@RequestParam 解决参数名不匹配,MultipartFile对象参数存储 上传文件的相关信息;
		 * HttpSession session 							:用于获取服务器 根路径;	
		 */
		if(!myfile.isEmpty()){							//判断 文件是否存在,不存在则不做文件上传操作;
			try {
				//获取上传路径: path
				//session.getServletContext() 获取服务器项目的根目录 .getRealPath("/myfile/"); 根目录下指定的文件,一般会在服务器中建一个文件专门存储上传的文件;
				String path = session.getServletContext().getRealPath("/myfile/");			//获取当前要上传服务器的路径;
				//上传的的文件名称: fileName
				String fileName = System.currentTimeMillis()+myfile.getOriginalFilename();					
				File updatefile = new File(path, fileName);									//IO文件操作,创建出对应的fileName文件名,放在对应的path目录下;
				//执行上传: 上面只是在指定目录下创建出了一个空的文件 updatefile; 但里面啥也没有;
				myfile.transferTo(updatefile);												//将数据存在 指定的文件中;
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return "ok";			//返回页面;
	}

	/*MultipartFile类型:
	 * 常用方法:
	 * 		isEmpty(); 	判断是否存在文件,true存在 false不存在		返回值 boolean
	 * 		getSize();	获取当前文件上传大小,可以进行对应验证;	 	返回值 long 即:文件的单位 字节; 1024字节=1kb 1024kb=1Mb..
	 * 		getOriginalFilename();	获取当前文件名,可用于获取文件后缀来来限制文件上传格式;  返回值 String
	 * 		transferTo(File);		参数文件类型,将指定的文件存在对应的 File 上;
	 * */
  1. 上传异常给予提示: 上面实例Demo 没有写~ 大概思路: 控制器方法中存储一个 request ,如果上传过程中产生异常, 就往作用域中存一个 异常信息; 页面表单中有一个隐藏作用域: < input type=“hidden” id=“xx” value="

多文件上传:

多文件上传就比较简单咯~ 代码改动不多, 表单加一个 File (毕竟要多上传一个文件呀~) 控制器 稍微微~ 修改即可;

表单:

代码语言:javascript
复制
	<form action="myupload" method="post" enctype="multipart/form-data">
	
		<p>	 <input type="text" name="name">	</p>		<!-- 模拟上传人 -->
		
		<p>  <input type="file" name="myfile">  </p>		<!-- 上传文件:用来上传文件的file组件 -->
		
		<p>  <input type="file" name="myfile">  </p>		<!-- 上传文件:两个名字一样~ -->
			
		</p> <input type="submit" value="上传"> </p>			<!-- 提交 -->
	</form>

控制器:

代码语言:javascript
复制
	@RequestMapping("/myupload")
	public String myupload(String name,@RequestParam("myfile") MultipartFile myfiles[],HttpSession session) {	
		//参数 MultipartFile myfile 变为一个数组 myfiles[]
		
		//并使用 foreach 进行遍历~ ....就ok了我凑真简单~!
		for (MultipartFile myfile : myfiles) {
		if(!myfile.isEmpty()){							//判断 文件是否存在,不存在则不做文件上传操作;
			try {
				//获取上传路径: path
				//session.getServletContext() 获取服务器项目的根目录 .getRealPath("/myfile/"); 根目录下指定的文件,一般会在服务器中建一个文件专门存储上传的文件;
				String path = session.getServletContext().getRealPath("/myfile/");			//获取当前要上传服务器的路径;
				System.out.println(path);
				//上传的的文件名称: fileName
				String fileName = System.currentTimeMillis()+myfile.getOriginalFilename();					
				File updatefile = new File(path, fileName);									//IO文件操作,创建出对应的fileName文件名,放在对应的path目录下;
				//执行上传: 上面只是在指定目录下创建出了一个空的文件 updatefile; 但里面啥也没有;
				myfile.transferTo(updatefile);												//将数据存在 指定的文件中;
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		}
		return "ok";			//返回页面;
	}
	
	//System.currentTimeMillis() 获得系统的时间,单位为毫秒; + myfile.getOriginalFilename(); 文件名; 
	//为了防止文件重名异常问题~

ok ~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringMVC 实现文件上传:
    • 单文件上传:
      • 多文件上传:
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档