【springMVC】之文件上传

   通过前两篇博客的学习,想必大家对springMVC已经有了一个基本的认识。今天我们主要来学习一下springMVC两种文件上传的方式。

    首先介绍第一种,通过字节流的方式实现文件上传。首先创建一个upload.jsp页面

<body>
	<h>添加用户</h>
	//entype要声音和支撑这种类型的,保证文件上传不会被解码
	//form表单,action是说讲这个表单提交到什么路径;
	//method="post"是提交方式,post的意思是提交的 时候不在地址栏显示你的提交信息,比如账号、密码之类的
	<form name="userForm" action="/springMVC/file/upload" method="post" entype="multipart/form-data">
		//定义一个file类型的input,name可以随便起,但是要和后台对应
		选择文件:<input type="file" name="file">
		<input type="submit" value="上传">
	</form>
</body>
然后在spring--servlet.xml配置文件中配置一下

<!--注入一个文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	//解析器有三个属性
	//编码
	<property name="defaultEncoding" value="utf-8"/>
	//文件的最大值
	<property name="maxUploadSize" value="10485760000"/>
	//缓存的最大值
	<property name="maxInMemorySize" value="40960"/>
</bean>
新建一个java类UploadController.java

@Controller
@RequestMapping("/file")
public class UploadController{
	
	@RequestMapping("/upload")
	//springMVC给咱们定义好的CommonsMultipartFile数据类型去接收前端传过来的文件(前端对应的name的名称file)
	//@RequestParam("file")然后给它一个注释,告诉springMVC这是要接收的文件类型的数据
	public String addUser(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException{
		
		System.out.println("fileName----------->" + file.getOriginalFilename());
		
		//然后就是一个普通的java的读取文件的方法
		if(!file.isEmpty()){
			try{
				//首先new一个FileOutputStram文件输出流
				FileOutputStram os = new FileOutputStram("D"/app" + new Date().getTime() + file.getOriginalFilename());
				//然后再拿到文件的输入流
				IntputStram in = file.getInputStream();
				int b = 0;
				
				//然后一个字节一个字节的读文件
				while((b=in.read()) != -1){
					os.write(b);
				}
				//然后再把流关掉
				os.flush();
				os.close();
				in.close();
			}catch(FileNotFoundException e){
				e.printStackTrace();
			}
		}
		return "/success";	
	} 
}
但是运行的时候出现500错误



这是什么原因造成的呢?原来是没有引入jar包的原因。文件上传是需要一套jar包的,这是我们原来引用的jar包


我们会发现没有上传下载流的jar包。文件上传除了引入springMVC所需的jar包之外,还需要引入如下jar包。


注:jar包下载地址:http://download.csdn.net/detail/huanjileaimeidan/8245243

       http://download.csdn.net/detail/huanjileaimeidan/8245251


*****************************************此处应有分割线**********************************************


文件上传优化:

用上面那种方法上传文件有点慢,下面我们介绍另一种文件上传方式,是通过springMVC包装好的解析器进行上传。


这是一个接口,继承了HttpServletRequest,下面来说说上面那三个方法:

第一个方法getFile,直接拿到一个文件,通过什么拿到文件,就是jsp页面里面的name,返回值是一个MultipartFile

第二个方法是一个getFileMap,也可能拿到的是一个多文件

第三个方法是拿到一个file的名称的方法,返回一个迭代器类型的,拿到的是所有file的名称(既然是迭代器,我们就可以迭代访问每一个file)。

我们以后学习springMVC首选的还是这种方法,比较快捷。好了,下面我们来具体说一下怎么操作。

首先,创建的upload.jsp页面不动。UploadController.java这个类里面新写一个方法。

@RequestMapping("/upload2")
	public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		//判断request里面是否是Multipart类型的数据
		if(multipartResolver.isMultipart(request)){
			//把request强制转换成MultipartHttpServletRequest类型的
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
			
			//用迭代器去判断里面有多少文件,遍历文件的一个方法
			Iterator<String> iter = multiRequest.getFileNames();
			while (iter.hasNext()) {
				//迭代器的作用就是一个一个拿文件,把文件拿到
				MultipartFile file = multiRequest.getFile((String)iter.next());
				if(file != null){
					//拿到文件之后输出文件
					//首先定义文件名称
					String fileName = "demoUpload" + file.getOriginalFilename();
					//定义输出路径
					String path = "D:/" + fileName;
					//初始化文件
					File localFile = new File(path);
					//用stringMVC给咱们提供的方法给它写到本地去
					file.transferTo(localFile);
				}				
			}
		}
		return "/success";
	}

****************************************此处应有分割线***********************************************

好了,这样通过springMVC自带的解析器上传文件就完成了。我们通过比较发现,通过解析器上传文件不仅代码比通过字节流上传简单好多,而且上传的效率也快好多。通过两种方式上传文件,不知道你了解没有。对比二者的优劣,在实际的项目中有选择的进行取舍。好了,今天关于springMVC上传文件的博客就写到这里。最近在用springMVC+ejb做ITOO的项目,对springMVC和EJB的结合感触特别多,以后会慢慢更新相应的博客。欢迎大家在下方留言,和我沟通讨论,我们一同学习进步!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值