天天看点

穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传

主题:Spring MVC中的文件上传

    • 开发环境
    • 更多干货
    • 页面
    • Spring里的配置
    • 要求
    • 总结
    • 野路子

开发环境

基于:

IntelliJ IDEA

Maven构建工具

JDK1.8

SpringBoot 2.3.4

Spring4.3.28

编写。

官人如需使用 IDEA 请阅读教程:IntelliJ IDEA

官人如需使用 Maven 请阅读教程:Maven 构建工具的下载与安装

更多干货

请参考:《穿越 Java 之 语法基础篇》 系列文章

请参考:《穿越 Java 之 Web基础篇 》系列文章

请参考:《穿越 Java 之 开发必备框架篇 》 系列文章

请阅读:《穿越 Java 之 SpringBoot框架篇》系列文章

请阅读:《穿越 Java 之 SpringCloud微服务架构篇》 系列文章

页面

  • form表单需要注意:

    method = “post"

    encrytype=“multipart/form-data”

    form表单的action 属性指定位置 进行上传操作。

Spring里的配置

1.显示页面。 页面在WEB-INF下客户打不开 需要 controller

  • 默认情况下,Spring MVC 的

    MultipartResolver

    组件,并没有配置在Spring容器中(DispatcherServlet就不会使用) 下图为源码过程
    穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传
    穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传
    穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传
  • 要想处理文件上传的请求,需要自己向容器中注册 该组件
穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传

要求

  • bean的名称必须是

    multipartResolver

    ,类型必须是

    MultipartResolver

    的实现类。

    下图两个实现类 StandardServletMultipartResolver是标准的Servlet 3.0以后的实现 ,

    CommonsMultipartResolver是 Commons fileupload 组件的实现

    穿越Java - 开发框架篇 第三章 Spring Mvc | 第10节Spring Mvc 中的文件上传

总结

  • 如果DispatcherServlet的某种组件只有一个时, 它的名字是不行瞎叫的(名字就是接口的首字母小写)。
  • 如果某种组件的个数有多个,名字起不起,以及叫什么都无所谓,只要类型匹配即可。
  • 如果使用 CmmonsMultipartResolver 需要导入依赖:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.4</version>
</dependency>
           
  • 后续处理器方法上的形参类型可以写(MultipartFile)。
@PostMapping("/upload")
    public String upload(@RequestParam("photo") MultipartFile file) throws IOException {

        String originalFilename = file.getOriginalFilename();//原始文件名
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); //后缀名
        String filename= UUID.randomUUID().toString().replace("-", "") + extension;

        //假设上传到C盘
        String realPath = webApplicationContext.getServletContext().getRealPath("/upload");
        file.transferTo(new File(realPath,filename));

        return "redirect:http://www.baidu.com";
    }
           

野路子

@PostMapping("/upload2")
    public String upload2(HttpServletRequest request){
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getServletContext());
        MultipartHttpServletRequest multipartHttpServletRequest = commonsMultipartResolver.resolveMultipart(request);
        MultipartFile photo = multipartHttpServletRequest.getFile("photo");

        //后续都一样。
        System.out.println(photo!=null);

        return "redirect:http://www.baidu.com";
    }
           

继续阅读