Spring MVC 文件上传

Spring MVC 为文件上传提供了直接支持,这种支持是通过即插即用的 MultipartResolver 实现的。Spring 使用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver。

在 Spring MVC 上下文中默认没有装配 MultipartResolver,因此默认情况下不能处理文件的上传工作。如果想使用 Spring 的文件上传功能,则需要先在上下文中配置 MultipartResolver。

1.配置 MultipartResolver

下面使用 CommonsMultipartResolver 配置一个 MultipartResolver 解析器。

<!-- 文件上传 -->
<bean id="multipartResolver"
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
  p:defaultEncoding="UTF-8"//①请求的编码格式,默认为ISO-8859-1
  p:maxUploadSize="5000000"//②上传文件的大小上限,单位为字节(5MB)
  p:uploadTempDir="file://d:/temp"/>//③上传文件的临时路径

defaultEncoding 必须和用户 JSP 的 pageEncoding 属性一致,以便正确读取表单的内容。uploadTempDir 是文件上传过程中所使用的临时目录,文件上传完成后,临时目录中的临时文件会被自动清除。

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

2.编写控制器和文件上传表单页面

在 UserController 中添加一个用于处理用户头像上传的方法,如下面代码所示。

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/uploadPage")//
    public String updatePage() {    
        return "uploadPage";
    }
    
    @RequestMapping(value = "/upload")
    public String updateThumb(@RequestParam("name") String name,
                              @RequestParam("file") MultipartFile file) throws Exception{
                              //②上传的文件自动绑定到MultipartFile中
        if (!file.isEmpty()) {
            file.transferTo(new File("d:/temp/"+file.getOriginalFilename()));
            return "redirect:success.html";
        }else{
            return "redirect:fail.html";
        }
    }
}

Spring MVC 会将上传文件绑定到 MultipartFile 对象中。MultipartFile 提供了获取上传文件内容、文件名等方法,通过其 transferTo() 方法还可将文件存储到硬件中,具体说明如下。

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

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

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>请上传用户头像</title>
    </head>
    <body>
        <h1>
            请选择上传的头像文件
        </h1>
        <form method="post" action="<c:url value="/user/upload.html"/>" enctype="multipart/form-data">//指定表单内容类型,以便支持文件上传
            <input type="text" name="name" />
            <input type="file" name="file" />//②上传文件的组件名
            <input type="submit" />
        </form>
    </body>
</html>
原文地址:https://www.cnblogs.com/jwen1994/p/11182923.html