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>
posted @ 2016-09-09 09:23  汪小成  阅读(232)  评论(0编辑  收藏  举报