Spring MVC实现文件上传

Spring 内置对多路上传的支持,专门用于处理 Web 应用中的文件上传。 开发者可以通过注册一个可插拔的 MultipartResolver 对象来启用对文件多路上传的支持。该接口在定义于 org.springframework.web.multipart 包下。Spring 为一般的文件上传提供了 MultipartResolver 接口的一个实现,为 Servlet 3.0 多路请求的转换提供了另一个实现。

默认情况下,Spring 的多路上传支持是不开启的,因为有些开发者希望由 自己来处理多路请求。如果想启用 Spring 的多路上传支持,你需要在 Web 应用的上下文中添加一个多路传输解析器。每个进来的请求,解析器都会检 查是不是一个多部分请求。若发现请求是完整的,则请求按正常流程被处理;如果发现请求是一个多路请求,则你在上下文中注册的 MultipartResolver 解析器会被用来处理该请求。之后,请求中的多部分上传属性就与其他属性一样被正常对待了。

1、CommonsMultipartResolver

在spring配置文件中配置id为multipartResolver的bean,如下:

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

当然,要让多路解析器正常工作,你需要在 classpath 路径下准备必须的 jar 包。如果使用的是通用的多路上传解析器 CommonsMultipartResolver,开发者所需要的 jar 包是 commons-fileupload.jar。

在pom.xml中间中添加如下依赖:

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>

当 Spring 的 DispatcherServlet 检测到一个多部分请求时,它会激活在上下文中声明的多路解析器并把请求交给它。解析器会把当前的 HttpServletRequest 请求对象包装成一个支持多路文件上传的请求对象 MultipartHttpServletRequest。有了 MultipartHttpServletRequest 对象,你不仅可以获取该多路请求中的信息,还可以在你的控制器中获得该多路请求的内容本身。

2、上传文件Controller控制器

文件上传控制器与一般注解了@Controller 的控制器基本一样,除了它接受的方法参数类型是 MultipartHttpServletRequest 或 MultipartFile。

@Controller
public class UploadFileController {

    @RequestMapping(value = "/upload.do",method = RequestMethod.POST)
    public String handleFormUpload(MultipartFile uploadFile, HttpServletRequest request){
        if (uploadFile.isEmpty()){
            System.out.println("file not find");
        }
        try {
            byte[] bytes = uploadFile.getBytes();
            // 其他的处理逻辑
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

}

在上面的例子中,最终拿到了 byte[]文件数据,只是没对它做任 何事。在实际应用中,可能会将它保存到数据库、存储在文件系统上,或做其他的处理。 当使用 Servlet 3.0 的多路传输转换时,你也可以使用 javax.servlet.http.Part

3、上传文件的表单文件

当解析器 MultipartResolver 完成处理时,请求便会像其他请求一样被正常流程处理。首先,创建一个接受文件上传的表单将允许用于直接上传整个表单。编码属性(enctype="multipart/form-data")能让浏览器知道如何对多路上传请求的表单进行编码(encode)。

--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>upload file</title>
</head>
<body>
    <h1>please select a file:</h1>
    <form action="${pageContext.request.contextPath}/upload.do" method="POST" enctype="multipart/form-data">
        <input type="file" name="uploadFile"/>
        <input type="submit"/>
    </form>
</body>
</html>

4、测试

启动项目之后访问upload.jsp可出现如下页面:

选择一个文件提交之后:

一个利用Spring MVC简单的实现文件上传的功能就完成了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值