• 第一节:SpringMVC 的文件上传


    一、SpringMVC 的文件上传

      1、Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。
      2、Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver
      3、SpringMVC 上下文中默认没有装配 MultipartResolver,因此默认情况下不能处理文件的上传工作,如果想要使用 Spring 的文件上传功能,需要在上下文中配置 MultipartResolver。
        MultipartFile  接口:
        

       继承结构:

        
      4、配置 MultipartResolver
         其中有两个常用属性:
                defaultEncoding:必须和用户 JSP 的 pageEncoding 属性一致,以便于正确解析表单的内容;
                maxUploadSize:设置上传文件的最大文件的大小(单位是字节);
         注意:为了让 CommonsMultipartResolver 正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的类包添加到类路径下。
        

    二、文件上传示例

      1、导入 jar 包

    commons-fileupload-1.2.1.jar
    commons-io-2.0.jar

        Maven 方式:

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

      2、配置文件解析器

        在SpringMVC中配置一个文件上传解析器:

        <!--  配置文件上传解析器,id必须是  multipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--设置上传文件的最大值-->
            <property name="maxUploadSize" value="#{1024*1024*1024}"/>
            <!--设置默认编码-->
            <property name="defaultEncoding" value="utf-8"/>
        </bean>

      配置文件上传解析器,id必须是"multipartResolver",否则会报错误:

    java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured
    

      

      3、页面表单

    <form action="${ctp}/upload" method="post" enctype="multipart/form-data">
        用户头像:<input type="file" name="headerImg" /><br>
        用户名称:<input type="text" name="userName" /><br>
        <input type="submit" value="提交">
    </form>

      4、控制器方法

        @RequestMapping(value = "/upload")
        public String upload(@RequestParam(value = "userName", required = false) String userName,
                             @RequestParam(value = "headerImg") MultipartFile uploadFile,
                             Model model) {
    
            System.out.println("上传的文件的信息:" + uploadFile);
            System.out.println(uploadFile.getName());
            System.out.println(uploadFile.getOriginalFilename());
    
            //文件保存
            File localFile = new File("H:\\111学习\\" + uploadFile.getOriginalFilename());
            try {
                uploadFile.transferTo(localFile);
                model.addAttribute("msg", "文件上传成功!");
            } catch (IOException e) {
                model.addAttribute("msg", "文件上传失败!" + e.getMessage());
            }
    
    
            return "forward:/index.jsp";
        }

      5、小结

      (1)文件上传表单准备, enctype="multipart/form-data"
      (2)导入 commons-fileupload
      (3)只要在 SpringMVC 配置文件中,配置一个文件上传解析器 MultipartResolver
      (4)文件上传请求处理
        只需要在处理器入参写一个@RequestParam(value = "headerImg") MultipartFile uploadFile 封装当前文件的信息,可以直接保存

     

    三、多文件上传

      当有多个 File 需要上传时,可以使用数组来接收:

      页面表单:

    <form action="${ctp}/uploadFiles" method="post" enctype="multipart/form-data">
        用户头像:<input type="file" name="headerImg" /><br>
        用户头像:<input type="file" name="headerImg" /><br>
        用户头像:<input type="file" name="headerImg" /><br>
        用户头像:<input type="file" name="headerImg" /><br>
        用户名称:<input type="text" name="userName" /><br>
        <input type="submit" value="提交">
    </form>

      控制器方法:

        /**
         * 多文件上传
         * @param userName
         * @param uploadFile
         * @param model
         * @return
         */
        @RequestMapping(value = "/uploadFiles")
        public String uploadFiles(@RequestParam(value = "userName", required = false) String userName,
                             @RequestParam(value = "headerImg") MultipartFile[] uploadFile,
                             Model model) {
    
            System.out.println("上传的文件的信息:" + uploadFile);
            for (MultipartFile multipartFile : uploadFile) {
                if (!multipartFile.isEmpty()) {
                    //获取上传文件的名称
                    String fileName =  multipartFile.getOriginalFilename();
    
                    //使用 UUID 或时间戳来给文件命名,防止重名
                    String finalFileName =  UUID.randomUUID()  +fileName.substring(fileName.lastIndexOf("."));
    
                    //设置文件保存的位置
                    String path =  "H:\\111学习" +  File.separator + finalFileName;
    
                    File newFile = new File(path);
    
                    try {
                        //将文件从原处复制到目标处
                        multipartFile.transferTo(newFile);
                        model.addAttribute("msg", "文件上传成功!");
                    } catch (IOException e) {
                        model.addAttribute("msg", "文件上传失败!" + e.getMessage());
                    }
                }
            }
            return "forward:/index.jsp";
        }

      如果表单里面的 file 的name 值不一样,可以在入参再写一个 MultipartFile 进行接收即可。

  • 相关阅读:
    B1028人口普查
    B1004成绩排名
    B1041考试座位号
    A1009 Product of Polynomials多项式相乘
    A1002 A+B for Polynomials 多项式相加
    B1010一元多项式求导
    A1065 A+Band C(64 bit)
    A1046 Shortest Distance 最短路径
    排序
    windows 平台使用wireshark命令行抓包
  • 原文地址:https://www.cnblogs.com/niujifei/p/15643471.html
Copyright © 2020-2023  润新知