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

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

****************************************************************前端

今天遇到一個坑,這裏給你們介紹一下。
如今不少文件上傳類型都是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>  

後臺接收代碼:spring

/**   
     * 文件上傳具體實現方法;   
     *    
     * @param file   
     * @return   
     */    
    @RequestMapping("/upload")    
    @ResponseBody    
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {    
        if (!file.isEmpty()) {    
            try {    
                /*   
                 * 這段代碼執行完畢以後,圖片上傳到了工程的跟路徑; 你們本身擴散下思惟,若是咱們想把圖片上傳到   
                 * d:/files你們是否能實現呢? 等等;   
                 * 這裏只是簡單一個例子,請自行參考,融入到實際中可能須要你們本身作一些思考,好比: 一、文件路徑; 二、文件名;   
                 * 三、文件格式; 四、文件大小的限制;   
                 */    
                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>     

後臺接收代碼:app

@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類型的文件接收和其它是不同的,你們之後遇到的時候要千萬當心,不要像我同樣勇往直前的踩進去還傻傻的覺得是前端的錯誤。
相關文章
相關標籤/搜索