• SpringMVC-19-springmvc文件上传


    12.springmvc文件上传

    • Spring MVC 框架的文件上传基于 commons-fileupload 组件,在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。

    • 相对于commons-fileupload原生的上传方式,程序员减少了DiskFileItemFactory,ServletFileUpload和将请求解析为FileItem的工作

    • 通过Spring MVC 框架提供的MultipartResolver接口,它为文件上传提供了直接支持,用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作。

    • MultpartiResolver 接口有以下两个实现类:

    • StandardServletMultipartResolver:使用了 Servlet 3.0 标准的上传方式。
    • CommonsMultipartResolver:使用了 Apache 的 commons-fileupload 来完成具体的上传操作。
    • MultpartiResolver 接口具有以下方法。
    名称作用
    byte[] getBytes()以字节数组的形式返回文件的内容
    String getContentType()返回文件的内容类型
    InputStream getInputStream()返回一个InputStream,从中读取文件的内容
    String getName()返回请求参数的名称
    String getOriginalFillename()返回客户端提交的原始文件名称
    long getSize()返回文件的大小,单位为字节
    boolean isEmpty()判断被上传文件是否为空
    void transferTo(File destination)将上传文件保存到目标目录下

    12.1 单文件上传操作

    • 倒入依赖,需要导入 commons-io 和 commons-fileupload,但我们只需要导入commons-fileupload,这个jar包里面集成了 commons-io
    
        commons-fileupload
        commons-fileupload
        1.4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 配置 MultipartResolver
    
    
        
        
        
        
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 编写文件信息实体
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class FileExp {
        private String description;
        private CommonsMultipartFile multipartFile;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 编写文件上传控制器
    @Controller
    @RequestMapping("/file")
    public class FileUploadController {
    
        @RequestMapping("/toUploadPage")
        public String toUploadPage(){
            return "uploadpage";
        }
        /**
         * 把name=file控件的文件封装为一个CommonsMultipartFile对象
         * 批量上传CommonsMultipartFile为数组即可
         * @ModelAttribute 将对象作为model返回到前端
         * */
        @RequestMapping("/upload")
        public String upload(@ModelAttribute("fileExp") FileExp fileExp, HttpSession session) throws IOException {
            String filename = fileExp.getMultipartFile().getOriginalFilename();  //文件名
            //若文件名为空则返回到上传页
            if (StringUtils.isNullOrEmpty(filename)) {
                return "redirect:/file/toUploadPage";
            }
            String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
            File file1 = new File(uploadPath);
            if (!file1.exists()) {
                file1.mkdirs();
            }
            //文件输入流
            InputStream is = fileExp.getMultipartFile().getInputStream();
            //文件输出流
            FileOutputStream fos = new FileOutputStream(new File(file1, filename));
            byte[] bytes = new byte[1024*1024];
            int read = 0;
            if ((read = is.read(bytes))!=-1){
                fos.write(bytes,0,read);
                fos.flush();
            }
            fos.close();
            is.close();
            return "result";
        }
    
        //采用file.transferTo上传文件
        @RequestMapping("/upload2")
        public String upload2(@RequestParam("description") String description, @RequestParam("multipartFile") CommonsMultipartFile file, HttpSession session, Model model) throws IOException {
            String filename = file.getOriginalFilename();  //文件名
            //若文件名为空则返回到上传页
            if (StringUtils.isNullOrEmpty(filename)) {
                return "redirect:/file/toUploadPage";
            }
            //上传路径保存设置
            String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
            File file1 = new File(uploadPath);
            if (!file1.exists()) {
                file1.mkdirs();
            }
            file.transferTo(new File(file1,filename));
            FileExp fileExp = new FileExp(description, file);
            model.addAttribute("fileExp",fileExp);
            return "result";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    可以发现有两种方式:

    • 一种通过流传输的方式将文件上传
    • 另一种是CommonsMultipartFile对象的transferTo()方法,底层也是对流传输的封装。但用起来是方便不少。
    • 文件上传表单页面uploadpage.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 基于表单的文件上传需要使用 enctype 属性,并将它的值设置为 multipart/form-data,使用二进制流来传输文件,同时将表单的提交方式设置为 post。如果不设置默认是application/x-www-form-urlencoded
    • 表单的 enctype 属性指定的是表单数据的编码方式,该属性有以下 3 个值。
    • application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的 value 属性值。类似get方式将name和value拼接到请求后面。
    • multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。
    • text/plain:该编码方式只有当表单的 action 属性为“mailto:”URL 的形式时才使用,主要适用于直接通过表单发送邮件的方式。
    • 另外注意:表单参数和实体类对应问题。

    • 结果页面result.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    

    结果页面

    文件描述:${fileExp.description} 文件名:${fileExp.multipartFile.originalFilename}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    在这里插入图片描述

    12.2 多文件上传

    • 控制器方法,注意有空文件时,要做文件名为空的处理
    //采用file.transferTo上传多文件
    @RequestMapping("/upload3")
    public String upload3(@ModelAttribute("filesExp") FilesExp filesExp, HttpSession session) throws IOException {
        //上传路径保存设置
        String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
        File file1 = new File(uploadPath);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        String filename = "";
        //文件
        List files = filesExp.getMultipartFile();
        for (CommonsMultipartFile file: files) {
            filename = file.getOriginalFilename();
            if (StringUtils.isNullOrEmpty(filename)) {
                return "result2";
            }
            file.transferTo(new File(file1,filename));
        }
        return "result2";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 上传页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        多文件上传
    
    
    
    
    
    <%--
    
    --%>
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 结果页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    
        多文件上传结果显示
    
    
    

    结果页面

    文件名 文件描述
    ${filename.originalFilename} ${filesExp.description.get(status.index)}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    下一篇:SpringMVC-20-springmvc文件下载

  • 相关阅读:
    功能基础篇8——图形用户界面
    JSD-2204-Lombok插件-MyBatis配置.xml文件-Day03
    多环境与多数据源切换
    算法:JavaScript语言描述
    半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
    86双周t4 6143. 预算内的最多机器人数目 周赛309 t4 6170. 会议室 III
    Cesium 根据鼠标点击生成点击点的坐标信息
    C++----类型转换
    cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python
    Docker再学习 - 阿里加速配置篇
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/126001125