spring基于注解的上传
Spring支持web应用中的分段文件上传。这种支持是由即插即用的MultipartResolver来实现。
在Spring2.0时,Spring提供了两种现成的MultipartResolver
1.Commons FileUpload(http://jakarta.apache.org/commons/fileupload)
2. COS FileUpload(http://www.servlets.com/cos)
不过在spring2.5以后,则只支持Commons FileUpload了。
那么,在spring2.5基于注解的MVC中如何使用MultipartResolver呢,
下面通过一个例子来说明如何使用CommonsMultipartResolver执行附件上传。
首先我们来构建一个web工程,工程结构如下图所示:

关于springMVC的配置这里不再详述,读者可以参看以前的文章。
这里我们只需要在spring-servlet.xml中加入如下内容,用以通知spring加载文件上传处理器:
<!-- 定义文件上传处理器 --> <bean id="multipartResolver" />
//取得附件名称列表 Iterator iterator = multipartRequest.getFileNames(); while(iterator.hasNext()){ //循环取出每一个附件 MultipartFile multifile = multipartRequest.getFile((String)iterator.next()); System.out.println(multifile.getOriginalFilename()); } <form action="<%=request.getContextPath() %>/demo/upload.do" enctype="multipart/form-data" method="post"> file1:<input type="file" name="file1" id="file1" /> <br></br> file2:<input type="file" name="file2" id="file2" /> <br></br> <button type="submit">submit</button> </form>
@RequestMapping(value = "/demo/upload.do") public String handleImport( @RequestParam(value = "file1", required = false) MultipartFile file1, @RequestParam(value = "file2", required = false) MultipartFile file2, Model model) throws IOException { List<FileModel> list = new ArrayList<FileModel>(); if (file1 != null&&StringUtils.hasText(file1.getOriginalFilename())) { System.out.println(file1.getOriginalFilename()); FileModel fileModel1 = new FileModel(); fileModel1.setName(file1.getOriginalFilename()); fileModel1.setSize(file1.getSize()); String path = service.saveFileToServer(file1, ASVE_PATH); fileModel1.setPath(path); list.add(fileModel1); } if (file2 != null&&StringUtils.hasText(file2.getOriginalFilename())) { System.out.println(file2.getOriginalFilename()); FileModel fileModel2 = new FileModel(); fileModel2.setName(file2.getOriginalFilename()); fileModel2.setSize(file2.getSize()); String path = service.saveFileToServer(file1, ASVE_PATH); fileModel2.setPath(path); list.add(fileModel2); } model.addAttribute("list", list); return "demo/list"; }public String saveFileToServer(MultipartFile multifile, String path) throws IOException { // 创建目录 File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } // 读取文件流并保持在指定路径 InputStream inputStream = multifile.getInputStream(); OutputStream outputStream = new FileOutputStream(path + multifile.getOriginalFilename()); byte[] buffer = multifile.getBytes(); int bytesum = 0; int byteread = 0; while ((byteread = inputStream.read(buffer)) != -1) { bytesum += byteread; outputStream.write(buffer, 0, byteread); outputStream.flush(); } outputStream.close(); inputStream.close(); return path + multifile.getOriginalFilename(); } @RequestMapping(value = "/demo/uploadMulti.do") public String handleImport(Model model, DefaultMultipartHttpServletRequest multipartRequest) throws IOException { List<FileModel> list = new ArrayList<FileModel>(); if (multipartRequest != null) { Iterator iterator = multipartRequest.getFileNames(); while (iterator.hasNext()) { MultipartFile multifile = multipartRequest.getFile((String) iterator.next()); if (StringUtils.hasText(multifile.getOriginalFilename())) { System.out.println(multifile.getOriginalFilename()); FileModel fileModel = new FileModel(); fileModel.setName(multifile.getOriginalFilename()); fileModel.setSize(multifile.getSize()); String path = service.saveFileToServer(multifile, ASVE_PATH); fileModel.setPath(path); list.add(fileModel); } } } model.addAttribute("list", list); return "demo/list"; } <bean id="multipartResolver" value="100000"/> </bean>
@RequestMapping(value = "/test/upload2.do", method = POST) public String handleImport2(Model model, HttpServletRequest request) { CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 设置编码 commonsMultipartResolver.setDefaultEncoding("utf-8"); if (commonsMultipartResolver.isMultipart(request)) { // 转换成多部分request MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(request); Iterator iterator = multipartRequest.getFileNames(); while (iterator.hasNext()) { MultipartFile multifile = multipartRequest.getFile((String) iterator.next()); System.out.println(multifile.getOriginalFilename()); } commonsMultipartResolver.cleanupMultipart(multipartRequest); } return null; }