SpringMVC:进阶( 二 )

  • 表单的 enctype 属性是多部分表单形式 enctype=“multipart/form-data"
  • <form action="${pageContext.request.contextPath}/fileupload" method="post" enctype="multipart/form-data">名称:<input type="text" name="username"> <br>文件:<input type="file" name="filePic"> <br><input type="submit" value=https://www.isolves.com/it/cxkf/kj/2020-09-14/"单文件上传">文件上传原理当 form 表单的 enctype 取值为 application/x-www-form-urlencoded 时 , form 表单的正文内容格式是: name=value&name=value 。
    当 form 表单的 enctype 取值为 mutilpart/form-data 时 , 请求正文内容就变成多部分形式:
    当 form 表单修改为多部分表单时 , request.getParameter() 将失效 。
    输入表单项名称 username 为 "张人大" , 上传文件 filePic 为 "a.txt" , 其中文件的内容为 "test renda";此时表单的 Request Body 的有效载荷 payload 如下:
    -----------------------------17656195882531319514853385408Content-Disposition: form-data; name="username"?张人大-----------------------------17656195882531319514853385408Content-Disposition: form-data; name="filePic"; filename="a.txt"Content-Type: text/plain?test renda-----------------------------17656195882531319514853385408--单文件上传步骤分析:
    1. 导入 fileupload 和 io 坐标
    2. 配置文件上传解析器
    3. 编写文件上传代码
    导入 fileupload 和 io 坐标<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>配置文件上传解析器spring-mvc.xml
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设定文件上传的最大值为 5 MB = 5*1024*1024 B --><property name="maxUploadSize" value=https://www.isolves.com/it/cxkf/kj/2020-09-14/"5242880"/>编写文件上传代码<form action="${pageContext.request.contextPath}/fileupload" method="post" enctype="multipart/form-data">名称:<input type="text" name="username"> <br>文件:<input type="file" name="filePic"> <br><input type="submit" value=https://www.isolves.com/it/cxkf/kj/2020-09-14/"单文件上传">@RequestMapping("/fileupload")public String fileUpload(String username, MultipartFile filePic) throws IOException {// 获取表单的提交参数 , 完成文件上传System.out.println(username);// 获取原始的文件上传名String originalFilename = filePic.getOriginalFilename();filePic.transferTo(new File("E:/upload/" + username + "_" + originalFilename));// 转发到成功页面return "success";}多文件上传<form action="${pageContext.request.contextPath}/filesupload" method="post" enctype="multipart/form-data">名称:<input type="text" name="username"> <br>文件1:<input type="file" name="filePic"> <br>文件2:<input type="file" name="filePic"> <br><input type="submit" value=https://www.isolves.com/it/cxkf/kj/2020-09-14/"多文件上传">@RequestMapping("/filesupload")public String filesUpload(String username, MultipartFile[] filePic) throws IOException {//获取表单的提交参数 , 完成文件上传System.out.println(username);// 获取原始的文件上传名for (MultipartFile multipartFile : filePic) {String originalFilename = multipartFile.getOriginalFilename();multipartFile.transferTo(new File("E:/upload/" + username + "_" + originalFilename));}// 转发到成功页面return "success";} 
    异常处理异常处理的思路在 Java 中 , 对于异常的处理一般有两种方式:
    • 一种是当前方法捕获处理(try-catch) , 这种处理方式会造成业务代码和异常处理代码的耦合 。
    • 另一种是自己不处理 , 而是抛给调用者处理(throws) , 调用者再抛给它的调用者 , 也就是一直向上抛 。在这种方法的基础上 , 衍生出了 SpringMVC 的异常处理机制 。
    系统的 Dao、Service、Controller 出现都通过 throws Exception 向上抛出 , 最后由 SpringMVC 前端控制器交由异常处理器(HandlerExceptionResolver)进行异常处理:


    推荐阅读