spring提供commonsMultipartResolver解析器,用于实现文件上传功能(其实还是借助commons的文件上传jar)。
实现步骤:
1.导入jar包:
commons-fileupload-1.3.1
commons-io-2.2
commons-logging-1.0.4
2.在form表单中,需要设置method="post",还要设置enctype="multipart/form-data"
3.在Controller中,可以直接通过commonsMultipartResolver解析器的api方法来实现解析请求中的文件流数据
//获取上传文件的原名 String filename = file.getOriginalFilename(); //根据file取出流,上传到文件系统 file.transferTo(targetFile); //spring的api会自动实现把文件保存到服务器上
4. 在spring主配置文件 application.xml 中设置使用文件上传解析器
// 匹配文件上传解析器multipartResolver (id必须为这个名字) <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> //可以配置一些设置信息,如限制文件大小等 </bean>
注意:若设置了Restful风格,需要指定静态资源匹配(静态资源映射)
<mvc:resources location="/file/" mapping="/file/**"></mvc:resources>
一、单文件上传示例
//Controller页面 @RequestMapping("file1") public String fileupload1(MultipartFile file1,HttpServletRequest request){ //获取上传的文件原名 String filename = file1.getOriginalFilename(); //获取服务器真实物理路径 String realPath = request.getServletContext().getRealPath("file"); File targetFile = new File(realPath,filename); //路径为 /应用名/file/文件名 if(!targetFile.exists()){ //判断文件是否存在,如果不存在则创建文件和其父文件夹 targetFile.mkdirs(); //递归创建当前文件的父文件夹 } //上传到服务器的文件系统中 try { file1.transferTo(targetFile);//根据file1取出流,上传到文件系统 String url = request.getContextPath() + File.separator + "file" + File.separator + filename; //拼接文件的路径位置 request.setAttribute("url", url); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } return "fileupload/fileView"; } //jsp页面 <form action="${basePath}/upload/file1" method="post" enctype="multipart/form-data"> <input type="file" name="file1"> <input type="submit" value="上传"> </form>
二、多文件上传示例(方法和单文件上传基本一致,下面为注意点)
1. 表单上放多个file类型的input,并且name值一样
2. MultipartFile[]类型接收
3. @RequestParam("files") :files为页面提交的name值
//controller 代码 @RequestMapping("file2") public String fileupload2(@RequestParam("files")MultipartFile[] files,HttpServletRequest request){ List<String> urls = new ArrayList<String>(); for(MultipartFile file : files){ String filename = file.getOriginalFilename(); String realPath = request.getServletContext().getRealPath("file"); File targetFile = new File(realPath,filename); if(!targetFile.exists()){ targetFile.mkdirs(); } try { file.transferTo(targetFile); String url = request.getContextPath() + File.separator + "file" + File.separator + filename; urls.add(url); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } } request.setAttribute("urls",urls); return "fileupload/fileView"; } //jsp 页面代码 <form action="${basePath}/upload/file2" method="post" enctype="multipart/form-data"> <input type="file" name="files"> <input type="file" name="files"> <input type="submit" value="上传"> </form> //用c标签遍历输出 <c:forEach items="${urls}" var="u"> <img alt="" src="${u}"> </c:forEach>