springmvc中文件上传

对表单中的 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     }

 

 
posted @ 2020-08-13 20:37  浪里小白龙er  阅读(160)  评论(0编辑  收藏  举报