zoukankan      html  css  js  c++  java
  • 如何用SpringBoot框架来接收multipart/form-data文件

    https://blog.csdn.net/linzhiqiang0316/article/details/77016997

    ****************************************************************

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

    后台接收代码:

    /**   
         * 文件上传具体实现方法;   
         *    
         * @param file   
         * @return   
         */    
        @RequestMapping("/upload")    
        @ResponseBody    
        public String handleFileUpload(@RequestParam("file") MultipartFile file) {    
            if (!file.isEmpty()) {    
                try {    
                    /*   
                     * 这段代码执行完毕之后,图片上传到了工程的跟路径; 大家自己扩散下思维,如果我们想把图片上传到   
                     * d:/files大家是否能实现呢? 等等;   
                     * 这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如: 1、文件路径; 2、文件名;   
                     * 3、文件格式; 4、文件大小的限制;   
                     */    
                    BufferedOutputStream out = new BufferedOutputStream(    
                            new FileOutputStream(new File(    
                                    file.getOriginalFilename())));    
                    System.out.println(file.getName());  
                    out.write(file.getBytes());    
                    out.flush();    
                    out.close();    
                } catch (FileNotFoundException e) {    
                    e.printStackTrace();    
                    return "上传失败," + e.getMessage();    
                } catch (IOException e) {    
                    e.printStackTrace();    
                    return "上传失败," + e.getMessage();    
                }    
        
                return "上传成功";    
        
            } else {    
                return "上传失败,因为文件是空的.";    
            }    
        }    
    这样就可以实现对multipart/form-data类型文件的接收了。那如果是多个文件外加多个字段呢,下面接着看下一个多个文件上传的案例。
    前台HTML界面:
        <!DOCTYPE html>    
        <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"    
              xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">    
            <head>    
                <title>Hello World!</title>    
            </head>    
            <body>    
               <form method="POST" enctype="multipart/form-data" action="/batch/upload">     
                   <p>文件1:<input type="text" name="id" /></p>    
                   <p>文件2:<input type="text" name="name" /></p>    
                   <p>文件3:<input type="file" name="file" /></p>    
                   <p><input type="submit" value="上传" /></p>    
               </form>    
            </body>    
        </html>     

    后台接收代码:

    @RequestMapping(value = "/batch/upload", method = RequestMethod.POST)    
          @ResponseBody    
          public String handleFileUpload(HttpServletRequest request) {    
            MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);  
              List<MultipartFile> files = ((MultipartHttpServletRequest) request)    
                      .getFiles("file");   
              String name=params.getParameter("name");  
              System.out.println("name:"+name);  
              String id=params.getParameter("id");  
              System.out.println("id:"+id);  
              MultipartFile file = null;    
              BufferedOutputStream stream = null;    
              for (int i = 0; i < files.size(); ++i) {    
                  file = files.get(i);    
                  if (!file.isEmpty()) {    
                      try {    
                          byte[] bytes = file.getBytes();    
                          stream = new BufferedOutputStream(new FileOutputStream(    
                                  new File(file.getOriginalFilename())));    
                          stream.write(bytes);    
                          stream.close();    
                      } catch (Exception e) {    
                          stream = null;    
                          return "You failed to upload " + i + " => "    
                                  + e.getMessage();  
                      }    
                  } else {    
                      return "You failed to upload " + i    
                              + " because the file was empty.";    
                  }  
              }    
              return "upload successful";  
          }    
    这样就可以实现对多个文件的接收了功能了。SpringBoot还可以对接收文件的格式还有个数等等进行限制,我这里就不多说了,大家有兴趣的可以自己去了解了解。
    千万要记住SpringBoot对multipart/form-data类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。
  • 相关阅读:
    【正则】限定符-总
    【正则】字符类-总
    【正则】元字符-总
    【正则】基本知识点
    Linux 核心系统命令目录
    股票模型
    windows 批量删除用户
    cka 英文考试题
    cka 英文考试题
    李永乐说股票
  • 原文地址:https://www.cnblogs.com/zhao1949/p/9681701.html
Copyright © 2011-2022 走看看