spring mvc 三种上传文件方法实例

来源:互联网 发布:mac定制 编辑:程序博客网 时间:2024/05/22 13:31

spring reference中关于文件上传的方法不知三种,本文只举三个最常用方法的例子。

首先是html或者jsp文件:

<!DOCTYPE html><html><meta charset="utf-8"></head><body><h1>通过commons-fileupload上传文件</h1><form action="<%=basePath%>file/upload1" method="post"enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="upload"></form><h1>通过Servlet3上传文件</h1><form action="<%=basePath%>file/upload2" method="post"enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="upload"></form><h1>通过Servlet3中的javax.servlet.http.Part上传文件</h1><form action="<%=basePath%>file/upload3" method="post"enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="upload"></form></body></html>

方法一:通过MultipartFile和commons-fileupload上传

先要在dispatcher-servlert中进行配置:

<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="104857600" /><property name="maxInMemorySize" value="4096" /><property name="defaultEncoding" value="UTF-8" /></bean>
需要引入commons-fileupload.jar,maven配置如下:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency>
然后是@Controller 中的方法

@RequestMapping("/upload1")public String upload1(HttpServletRequest request)throws IllegalStateException, IOException {CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());if (multipartResolver.isMultipart(request)) {MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;Iterator<String> iterator = multipartHttpServletRequest.getFileNames();while (iterator.hasNext()) {MultipartFile file = multipartHttpServletRequest.getFile(iterator.next());if (file != null) {String fileName = "uploadFile" + file.getOriginalFilename();String path = "/Users/***/" + fileName;file.transferTo(new File(path));}}}return "success";}

方法二:通过MultipartFileServlet3上传

首先,这种方式的配置只能是servlet级别的,或者配置在web.xml中,或者在编程式配置Servlet时配置javax.servlet.MultipartConfigElement ,或者在控制器中引入注解javax.servlet.annotation.MultipartConfig

下面以web.xml配置为例:

<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup><!-- 为使用serlvet3进行文件上传而添加的设置 --><multipart-config><max-file-size>1073741824</max-file-size></multipart-config></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
然后在dispatcher-servlert中进行配置:

<bean id="multipartResolver"class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>
最后是@Controller 中的方法:

@RequestMapping(value = "/upload2", method = RequestMethod.POST)public String upload2(@RequestParam("file") MultipartFile file)<span style="white-space:pre"></span>throws IOException {if (!file.isEmpty()) {String fileName = "uploadFile" + file.getOriginalFilename();String path = "/Users/***/" + fileName;file.transferTo(new File(path));return "success";}return "fail";}

方法三:通过servlet3和javax.servlet.http.Part接口上传

配置同方法二

@Controller 中的方法为:

@RequestMapping(value = "upload3", method = RequestMethod.POST)public String upload3(@RequestParam("file") Part file) throws IOException {if (file.getSize() != 0) {String fileName = this.getFileName(file);if (fileName != null) {String path = "/Users/***/" + fileName;file.write(path);}}return "success";}// 获取上传文件名,没有则返回nullprivate String getFileName(Part part){  <span style="white-space:pre"></span>//获取header信息中的content-disposition,如果为文件,则可以从其中提取出文件名          String cotentDesc = part.getHeader("content-disposition");          String fileName = null;          Pattern pattern = Pattern.compile("filename=\".+\"");          Matcher matcher = pattern.matcher(cotentDesc);          if(matcher.find()){              fileName = matcher.group();              fileName = fileName.substring(10, fileName.length()-1);          }          return fileName;  }  






0 0
原创粉丝点击