对表单中的 enctype 属性做个详细的说明:
application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。
multipart/form-data:只能配合psot请求 这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
text/plain:除了把空格转换为 "+" 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。
1 <form action="${pageContext.request.contextPath}/admin/addUser" method="post" enctype="multipart/form-data"> 2 用户名称:<input type="text" name="username"><br><br><br> 3 用户性别:<input type="text" name="sex"><br><br><br> 4 用户住址:<input type="text" name="address"><br><br><br> 5 <input type="submit" value="添加"> 6 </form>
Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。
而Spring MVC则提供了更简单的封装。
Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:
CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache CommonsFileUpload的组件。、
1.导入上传文件支持的依赖
1 <dependency> 2 <groupId>commons-fileupload</groupId> 3 <artifactId>commons-fileupload</artifactId> 4 <version>1.3.3</version> 5 </dependency> 6 <dependency> 7 <groupId>javax.servlet</groupId> 8 <artifactId>javax.servlet-api</artifactId> 9 <version>4.0.1</version> 10 </dependency>
2.配置springmvc.xml,注册bean进入spring
1 <!--文件上传配置--> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容, 默认为ISO-8859-1 --> 4 <property name="defaultEncoding" value="utf-8"/> 5 <!-- 上传文件大小上限,单位为字节(10485760=10M) --> 6 <property name="maxUploadSize" value="10485760"/> 7 <property name="maxInMemorySize" value="40960"/> 8 </bean>
拓展:CommonsMultipartFile 的 常用方法:
String getOriginalFilename():获取上传文件的原名
InputStream getInputStream():获取文件流
void transferTo(File dest):将上传文件保存到一个目录文件中
3.编写前端支持
1 <form action="/upload" enctype="multipart/form-data" method="post">
2 <input type="file" name="file"/>
3 <input type="submit" value="upload">
4 </form>
4.编写controller
使用原始servlet方式进行文件上传(从输入到输出,即从文件中输入到缓冲区中再输出到内存中保存)
1 //使用servlet原始方式文件上传 2 //@RequestParam("file") 将name=file控件得到的文件封装成 CommonsMultipartFile 对象 3 //批量上传CommonsMultipartFile则为数组即可 4 @RequestMapping("/upload") 5 public String upload(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException { 6 //获取文件名 : file.getOriginalFilename(); 7 String uploadFileName = file.getOriginalFilename(); 8 System.out.println("上传文件名 : "+uploadFileName); 9 //上传路径保存设置 10 String path = request.getSession().getServletContext().getRealPath("/upload"); 11 //如果路径不存在,则创建一个 12 File realPath = new File(path); 13 if (!realPath.exists()){ 14 realPath.mkdir(); 15 } 16 System.out.println("上传文件保存地址:"+realPath); 17 //文件输入流 18 InputStream is = file.getInputStream(); 19 //文件输出流 20 OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); 21 //读取写出 22 int len = 0; 23 byte[] buffer = new byte[1024]; 24 while ((len = is.read(buffer)) != -1) { 25 os.write(buffer, 0, len); 26 os.flush(); 27 } 28 os.close(); 29 is.close(); 30 return "redirect:/show.jsp"; 31 }
采用springmvc自带的文件上传
1 //采用springmvc中自带的file.transto方式上传 2 @RequestMapping("/upload2") 3 public String upload2(@RequestParam("file2") CommonsMultipartFile file,HttpServletRequest request) throws IOException { 4 //上传路径保存设置 5 String path = request.getSession().getServletContext().getRealPath("/upload"); 6 File realPath = new File(path); 7 //如果没有就创建 8 if (!realPath.exists()){ 9 realPath.mkdir(); 10 } 11 //上传文件地址 12 System.out.println("上传文件保存地址:"+realPath); 13 //通过CommonsMultipartFile的方法直接写文件(注意这个时候) 14 file.transferTo(new File(realPath +"/"+ file.getOriginalFilename())); 15 return "redirect:/show.jsp"; 16 }
文件下载(从输出到输入,即从内存中输出到缓冲流中在输入到指定文件中)
1 //文件下载(从输出到输入,即从内存中输出到缓冲流中在输入到指定文件中) 2 @RequestMapping("/downloads") 3 public String downloads(HttpServletRequest request, HttpServletResponse response) throws IOException { 4 //要下载的图片地址 5 String path = request.getSession().getServletContext().getRealPath("/upload"); 6 String fileName = "基础语法.jpg"; 7 //1、设置response 响应头 8 response.reset();//设置页面不缓存,清空buffer 9 response.setCharacterEncoding("UTF-8");//字符编码 10 response.setContentType("multipart/form-data"); //二进制传输数据 11 //设置响应头 12 response.setHeader("Content-Disposition", "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8")); 13 //把将要下载的资源放假文件中 14 File file = new File(path,fileName); 15 //2、 读取文件--输入流 16 InputStream input=new FileInputStream(file); 17 // 3、 写出文件--输出流 18 OutputStream out = response.getOutputStream(); 19 byte[] buff = new byte[1024]; 20 int index = 0; 21 // 4、执行 写出操作 22 while ((index = input.read(buff)) != -1) { 23 out.write(buff, 0, index); 24 out.flush(); 25 } 26 out.close(); 27 input.close(); 28 return null; 29 }