首页 > 代码库 > 【springMVC】之文件上传
【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=http://www.mamicode.com/"上传">>然后在spring--servlet.xml配置文件中配置一下<!--注入一个文件上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--解析器有三个属性--> <!--编码--> <property name="defaultEncoding" value=http://www.mamicode.com/"utf-8"/>>新建一个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的结合感触特别多,以后会慢慢更新相应的博客。欢迎大家在下方留言,和我沟通讨论,我们一同学习进步!
【springMVC】之文件上传