如何用SpringBoot框架來接收multipart/form-data文件
阿新 • • 發佈:2018-09-20
otf 判斷 ack 限制 pub dex *** multi 前臺
前臺HTML代碼:
https://blog.csdn.net/linzhiqiang0316/article/details/77016997
****************************************************************
今天遇到一個坑,這裏給大家介紹一下。 現在很多文件上傳類型都是multipart/form-data類型的,HTTP請求如下所示: 可是問題就在於如果用傳統的Struts2或者servlet等都可以很容易的實現文件接收的功能,例如下面的代碼就可以實現:boolean isMultipart = ServletFileUpload.isMultipartContent(request);//可是今天我把這一段代碼放在SpringBoot上面的時候就怎麽也接收不到文件信息了,一直以為是前端什麽數據傳輸錯了。後來才知道原來SpringBoot有它自己的接收請求的代碼。下面就給大家詳細介紹一下它是如何實現這個功能的。 首選做一個簡單的案例,也就是單個文件上傳的案例。(這個案例是基於SpringBoot上面的,所以大家首先得搭建好SpringBoot這個框架)判斷是否是表單文件類型 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()); } }
<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類型的文件接收和其它是不一樣的,大家以後遇到的時候要千萬小心,不要像我一樣一往無前的踩進去還傻傻的以為是前端的錯誤。
如何用SpringBoot框架來接收multipart/form-data文件