如何用SpringBoot框架来接收multipart/form-data文件

来源:互联网 发布:意大利语发音软件 编辑:程序博客网 时间:2024/06/05 01:03
今天遇到一个坑,这里给大家介绍一下。
现在很多文件上传类型都是multipart/form-data类型的,HTTP请求如下所示:

可是问题就在于如果用传统的Struts2或者servlet等都可以很容易的实现文件接收的功能,例如下面的代码就可以实现:
[html] view plain copy
  1. boolean isMultipart = ServletFileUpload.isMultipartContent(request);//判断是否是表单文件类型    
  2. DiskFileItemFactory factory = new DiskFileItemFactory();    
  3. ServletFileUpload sfu = new ServletFileUpload(factory);    
  4. List items = sfu.parseRequest(request);//从request得到所有上传域的列表    
  5. for(Iterator iter = items.iterator();iter.hasNext();){    
  6.     FileItem fileitem =(FileItem) iter.next();    
  7.     if(!fileitem.isFormField()&&fileitem!=null){//判读不是普通表单域即是file    
  8.         System.out.println("name:"+fileitem.getName());    
  9.     }    
  10. }   
可是今天我把这一段代码放在SpringBoot上面的时候就怎么也接收不到文件信息了,一直以为是前端什么数据传输错了。后来才知道原来SpringBoot有它自己的接收请求的代码。下面就给大家详细介绍一下它是如何实现这个功能的。
首选做一个简单的案例,也就是单个文件上传的案例。(这个案例是基于SpringBoot上面的,所以大家首先得搭建好SpringBoot这个框架)
前台HTML代码:
[html] view plain copy
  1. <html>    
  2. <body>    
  3.   <form action="/upload" method="POST" enctype="multipart/form-data">    
  4.     <input type="file" name="file"/>    
  5.     <input type="submit" value="Upload"/>     
  6.   </form>    
  7. </body>    
  8. </html>    

后台接收代码:
[java] view plain copy
  1. /**    
  2.      * 文件上传具体实现方法;    
  3.      *     
  4.      * @param file    
  5.      * @return    
  6.      */      
  7.     @RequestMapping("/upload")      
  8.     @ResponseBody      
  9.     public String handleFileUpload(@RequestParam("file") MultipartFile file) {      
  10.         if (!file.isEmpty()) {      
  11.             try {      
  12.                 /*    
  13.                  * 这段代码执行完毕之后,图片上传到了工程的跟路径; 大家自己扩散下思维,如果我们想把图片上传到    
  14.                  * d:/files大家是否能实现呢? 等等;    
  15.                  * 这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如: 1、文件路径; 2、文件名;    
  16.                  * 3、文件格式; 4、文件大小的限制;    
  17.                  */      
  18.                 BufferedOutputStream out = new BufferedOutputStream(      
  19.                         new FileOutputStream(new File(      
  20.                                 file.getOriginalFilename())));      
  21.                 System.out.println(file.getName());    
  22.                 out.write(file.getBytes());      
  23.                 out.flush();      
  24.                 out.close();      
  25.             } catch (FileNotFoundException e) {      
  26.                 e.printStackTrace();      
  27.                 return "上传失败," + e.getMessage();      
  28.             } catch (IOException e) {      
  29.                 e.printStackTrace();      
  30.                 return "上传失败," + e.getMessage();      
  31.             }      
  32.       
  33.             return "上传成功";      
  34.       
  35.         } else {      
  36.             return "上传失败,因为文件是空的.";      
  37.         }      
  38.     }      
这样就可以实现对multipart/form-data类型文件的接收了。那如果是多个文件外加多个字段呢,下面接着看下一个多个文件上传的案例。
前台HTML界面:
[html] view plain copy
  1. <!DOCTYPE html>      
  2. <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"      
  3.       xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">      
  4.     <head>      
  5.         <title>Hello World!</title>      
  6.     </head>      
  7.     <body>      
  8.        <form method="POST" enctype="multipart/form-data" action="/batch/upload">       
  9.            <p>文件1:<input type="text" name="id" /></p>      
  10.            <p>文件2:<input type="text" name="name" /></p>      
  11.            <p>文件3:<input type="file" name="file" /></p>      
  12.            <p><input type="submit" value="上传" /></p>      
  13.        </form>      
  14.     </body>      
  15. </html>       
后台接收代码:
[java] view plain copy
  1. @RequestMapping(value = "/batch/upload", method = RequestMethod.POST)      
  2.       @ResponseBody      
  3.       public String handleFileUpload(HttpServletRequest request) {      
  4.         MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);    
  5.           List<MultipartFile> files = ((MultipartHttpServletRequest) request)      
  6.                   .getFiles("file");     
  7.           String name=params.getParameter("name");    
  8.           System.out.println("name:"+name);    
  9.           String id=params.getParameter("id");    
  10.           System.out.println("id:"+id);    
  11.           MultipartFile file = null;      
  12.           BufferedOutputStream stream = null;      
  13.           for (int i = 0; i < files.size(); ++i) {      
  14.               file = files.get(i);      
  15.               if (!file.isEmpty()) {      
  16.                   try {      
  17.                       byte[] bytes = file.getBytes();      
  18.                       stream = new BufferedOutputStream(new FileOutputStream(      
  19.                               new File(file.getOriginalFilename())));      
  20.                       stream.write(bytes);      
  21.                       stream.close();      
  22.                   } catch (Exception e) {      
  23.                       stream = null;      
  24.                       return "You failed to upload " + i + " => "      
  25.                               + e.getMessage();    
  26.                   }      
  27.               } else {      
  28.                   return "You failed to upload " + i      
  29.                           + " because the file was empty.";      
  30.               }    
  31.           }      
  32.           return "upload successful";    
  33.       }      
这样就可以实现对多个文件的接收了功能了。SpringBoot还可以对接收文件的格式还有个数等等进行限制,我这里就不多说了,大家有兴趣的可以自己去了解了解。
千万要记住SpringBoot对multipart/form-data类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。
原创粉丝点击