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";
}
// 获取上传文件名,没有则返回null
private 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;
}