SpringMVC 使用MultipartResolver下載檔案
阿新 • • 發佈:2018-11-02
MultipartResolver 用於處理檔案上傳,當收到請求時 DispatcherServlet 的 checkMultipart() 方法會呼叫 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含檔案。如果請求資料中包含檔案,則呼叫 MultipartResolver 的 resolveMultipart() 方法對請求的資料進行解析,然後將檔案資料解析成 MultipartFile 並封裝在 MultipartHttpServletRequest (繼承了 HttpServletRequest) 物件中,最後傳遞給 Controller,在 MultipartResolver 介面中有如下方法:
- boolean isMultipart(HttpServletRequest request); // 是否是 multipart
- MultipartHttpServletRequest resolveMultipart(HttpServletRequest request); // 解析請求
- void cleanupMultipart(MultipartHttpServletRequest request);
MultipartFile 封裝了請求資料中的檔案,此時這個檔案儲存在記憶體中或臨時的磁碟檔案中,需要將其轉存到一個合適的位置,因為請求結束後臨時儲存將被清空。在 MultipartFile 介面中有如下方法:
- String getName(); // 獲取引數的名稱
- String getOriginalFilename(); // 獲取檔案的原名稱
- String getContentType(); // 檔案內容的型別
- boolean isEmpty(); // 檔案是否為空
- long getSize(); // 檔案大小
- byte[] getBytes(); // 將檔案內容以位元組陣列的形式返回
- InputStream getInputStream(); // 將檔案內容以輸入流的形式返回
- void transferTo(File dest); // 將檔案內容傳輸到指定檔案中
1、StandardServletMultipartResolver 使用方式
1.1 配置檔案
<!--配置上傳下載--> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />
1.2 上傳表單
要在 form 標籤中加入 enctype="multipart/form-data" 表示該表單要提交檔案。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <div> <form:errors path="err" /> </div> <form action="/book/booksInput" method="post" enctype="multipart/form-data"> <input type="file" name="multipartFile" /> <input type="submit"/> </form> </body> </html>
1.3 處理檔案
//下載檔案 @PostMapping("/booksInput") public String imageshangchuan(@RequestPart("multipartFile") MultipartFile multipart, Model model) { //格式化時間 DateFormat format = new java.text.SimpleDateFormat("yyyyMMddhhmmss"); String date = format.format(new Date()); String file = multipart.getOriginalFilename(); //擷取檔名字 String fileName = file.substring(0, file.lastIndexOf(".")); String geshi = file.substring(file.lastIndexOf("."), file.length()); try { //獲取檔案格式 BufferedImage image = ImageIO.read(multipart.getInputStream()); //判斷格式,大小是否符合要求 if (image != null && multipart.getSize() < 1024*1024*1024*5 && !multipart.isEmpty()) { //生成檔案 multipart.transferTo(new File("E:/JavaIdea/Employee_SSM_MVC/src/main/webapp/img/upload_" + fileName + "_" + date + geshi)); return "book_home"; } else { model.addAttribute("err", "檔案不符合要求"); return "input"; } } catch (IOException e) { e.printStackTrace(); } return null; }
效果截圖: