Spring Web mvc Maven实现文件上传

昨天写了SpringWeb的Maven 工程搭建,今天来一个有点意思的,Spring mvc 实现文件上传,那么先将配置文件xx-servlet.xml展示一下,配置要对
<!-- 配置文件上传bean --> 
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="defaultEncoding" value="utf-8"></beans:property>
		<beans:property name="maxUploadSize" value="10485760000"></beans:property>
		<beans:property name="maxInMemorySize" value="40960"></beans:property>
	</beans:bean>
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

第一个就是文件上传的bean配置,里面有默认上传编码,最大可上传文件。第二个昨天没有说,是一个视图解析器,也就是说,昨天写的Controller会返回一个String,那么视图解析器会自动为期加上"prefix"前缀以及“.jsp”后缀,这样就可以找到某个路径下的.jsp文件,就会显示另一个界面。

<form action="upload" method="post" enctype="multipart/form-data">
	File to upload:<input type="file" name="file"><br/>
	File to upload:<input type="file" name="file"><br/>	 
	<button id="submit1" type="submit" value="submit">提交</button>
</form>
这里是jsp中在<body> </body>中间加上一个表单form,这里的action是决定提交给哪一个action来解决,这里的method要用post,如果用get,表单数据会以明文形式传输,不安全。这里的enctype一定得写
enctype="multipart/form-data"
这表明传递的是一个多媒体类型数据,否则会出错,接下来看一下处理文件上传的Controller

@Controller
public class FileUploadController {
	
	@RequestMapping("/upload")
	public String upload(@RequestParam("file")MultipartFile[] files,
			HttpServletRequest request,ModelMap model){
		if(files!=null&&files.length>0){
			for(int i=0;i<files.length;i++){
				MultipartFile file = files[i];
				//调用储存file的函数
				saveFile(request, file);
				model.put("name", file.getOriginalFilename());
			}
		}
		return "file";
	}
	
	/*
	 * 存储file的函数
	 */
	private boolean saveFile(HttpServletRequest request, MultipartFile file){
		if(!file.isEmpty()){
			try{
				String filePath = "F:\\"+"upload\\"+file.getOriginalFilename();
				File saveDir = new File(filePath);
				if(!saveDir.getParentFile().exists()){
					saveDir.getParentFile().mkdirs();
				}
				//文件转存
				file.transferTo(saveDir);
				return true;
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return false;
	}
}	
这个代码中,大家看到了@RequestParam,这个注解,可以指定括号内的字符串名,进而可以提取到相应的前台的值,这里在表单里写了两个上传,所以是可以传输多个文件的。所以,如果MultipartFile 的files数组不为空,则对于每一个file执行存储操作

存储函数判断file是否为空,不为空的话,肯定要先指定一个存储路径这里我指定的是F盘下的路径,注意\是转义标识符,所以两个\\才可以表明路径,不懂的同学自行查,后面的操作是建立一个文件夹来存上传文件,之后调用transferTo这个file的转存方法,就可以存好啦,效果很好。

String filePath = "F:"+File.separator+"upload"+File.separator+file.getOriginalFilename();

这里用了一个File.separator,可以得到文件路径的分隔符,由于linux和windows下分别为/和\,所以养成良好的习惯,多打几个字也是好的。

ModelMap将文件名存入model中,这样转给前段页面时,前端页面可以直接提取。

上面函数的return "download";就可以让视图解析器自动寻找这个jsp文件

/WEB-INF/views/file.jsp
看一下这个file.jsp

<body>
	${ name}
</body>
很简单的一个,就是使用${name}这个EL表达式来提取存在model中的文件名,这里的name是model键值对的key,很好理解,不懂EL表达式的同学可以自行查询



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值