首页 > 代码库 > SpringMVC 理论与实用技术(二)文件上传

SpringMVC 理论与实用技术(二)文件上传

文件上传相信大家都做过,几乎所有的项目都有上传文件的功能,尤其是BS架构的项目中常常被列为常规功能来开发,无论是在开发.NET 项目还是java项目我们会用到很多的框架,这个功能也被集成到了框架之中,因为他太常用了,框架就是为我们提供了一个开发项目的半成品结构,可以大大提高开发效率节省开发成本、缩短开发周期。

长话短说本文主要介绍一个怎么利用springmvc实现单个以及多个文件上传,附加说说上传文件的原理。

从具体的某个实例开始,先形似再神思

第一种方式设计思路:三个注意地方

1.表单页面

2.xml配置文件

3.uploadController类

在多次实践和开发的过程中会逐渐理解,编程思想和设计思路也同样很重要,他们是在反复实践中的出来的经验结晶有时比实践还要重要,就像伟大的结果很多是有伟大的思想开始的。

1.对于文件上传表单要有特殊的属性,如下

	<form action="/springmvc7/file/upload2"	enctype="multipart/form-data"  method="post">
		选择文件:<input type="file" name="file"/>
		
		<input type="submit"   value=http://www.mamicode.com/"上传" />>
表单的enctype属性需要进行秀给。

2.xml文件

	<!--   文件上传解析器配置以及大小编码等参数	 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		  <property name="defaultEncoding" value=http://www.mamicode.com/"utf-8" />>
上传文件的解析器类,这里只是配置了与普通的配置不一样的地方,相同的注解等配置可以参考前面几篇博客,这个类负责解析上传文件的各个参数和信息。

3.updaController.java

@Controller
@RequestMapping("/file")
public class UploadController {

	@RequestMapping("/upload")
	public String upload(@RequestParam("file") CommonsMultipartFile file ,HttpServletRequest request) throws IOException
	{
		System.out.println("filename---->"+file.getOriginalFilename());
	
		if (!file.isEmpty()) 
		{
			
			try {
				
				InputStream inputStream= file.getInputStream();
			
				FileOutputStream	 outputStream = new FileOutputStream("D:/"+new Date().getTime()+file.getOriginalFilename());
			
				int b=0;
				while ((b=inputStream.read()) != -1 ) {
					outputStream.write(b);
				}
				outputStream.flush();
				outputStream.close();
				inputStream.close();	
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		return "/success";
	}

这个方法是用来接受上传的文件,有个参数CommonsMultipartFile file,是用来接受文件的,它可以自己判断数据类型是否是文件类型,如果是文件类型就会受到再通过输出流输出到服务器上。

第二种方式同第一种很类似,只是从request里面取数据,我们都知道前后台交互的数据都是通过request、response这两个对象交互,上传了文件也会在这里面只要能从里面取出来就好。

uploadController2.java

	@RequestMapping("/upload2")
	public void upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException
	{
		CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver();
		
		if (multipartResolver.isMultipart(request)) {
			MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest)request;
			
			Iterator<String> iter=multipartRequest.getFileNames();
			while(iter.hasNext())
			{
				MultipartFile file=multipartRequest.getFile((String)iter.next());
				if (file!=null) {
					
					String filename="demo"+file.getOriginalFilename();
					String path="D:/"+filename;
					File localfile=new File(path);
					file.transferTo(localfile);
					
				}
			}
		}
	}

springmvc对request进行了封装所以可以转化为request类型,也可以从里面读取数据,框架大部分都是对底层的东西进行封装以便我们用这方便,它用这配置文件比struts2少了很多,觉得配置灵活了简单了,从这一点上看springmvc比struts2灵活了很多。