Spring MVC 笔记 —— Spring MVC 文件上传

文件上传

配置MultipartResolver

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="5242880" />
</bean>

dispatcher-servlet.xml配置文件配置MultipartResolverid属性必须要有且值只能是multipartResolver,否则会报错。

为了让CommonsMultipartResolver正常工作,必须先将Jakarta Commons FileUploadJakarta Commons io的类包添加到类路径下。

defaultEncoding必须和用户JSPpageEncoding属性一致,以便正确读取表单内容。

编写控制器

@Controller
@RequestMapping("demo")
public class DemoController {
@RequestMapping("/upload")
public String upload(HttpServletRequest request,
@RequestParam("file") MultipartFile file) throws Exception {
if (!file.isEmpty()) {
file.transferTo(new File("F:/" + file.getOriginalFilename()));
request.setAttribute("info", "上传成功!");
} else {
request.setAttribute("info", "上传失败!");
}
return "message";
}
}

Spring MVC 会将上传文件绑定到MultipartFile对象中。MultipartFile常用方法说明:

  • byte [] getBytes():获取文件数据。
  • String getContentType():获取文件MIME类型,如image/pjpegtext/plain等。
  • InputStream getInputStream():获取文件流。
  • String getName():获取表单中文件组件的名字。
  • String getOriginalFileName():获取上传文件的原名。
  • long getSize():获取上传文件的字节大小,单位是byte
  • boolean isEmpty():是否有上传的文件。
  • void transferTo(File dest):可以使用该文件将上传的文件保存到一个目标文件中。

编写文件上传表单页面

<html>
<head>
<title>Spring MVC 文件上传</title>
</head>
<body>
<h2>请选择文件:</h2>
<form method="post" action="${basePath}demo/upload"
enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
</body>
</html>

负责上传文件的表单和一般表单有一些区别,表单的类型编码必须是multipart/form-data类型。

问题

问题一

异常信息

java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory

原因及解决方法

缺少commons-fileupload-x.x.x.jar文件。目前(2016年9月06日)最新版本是1.3.2。

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>

问题二

异常信息:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
原因及解决方法:

配置MultipartResolver时未添加添加id属性或者id属性的值不是multipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="5242880" />
</bean>
上一篇:如何编译spring源码,并导入到eclipse中


下一篇:JAVA程序的创建与编辑