上一篇我們學習了資料分組校驗,已經可以靈活的在專案中進行資料校驗了,今天來學習SpringMVC的上傳檔案功能。相對來說SpringMVC的上傳功能,還是比較簡單的。
一、新增依賴
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency>
二、修改applicationContext.xml配置檔案
要想實現上傳功能,必須要配置一個解析器,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"><!-- 最大上傳檔案大小 100M --> <value>104857600</value> </property> <property name="maxInMemorySize"><!-- 最大上傳快取大小 4k --> <value>4096</value> </property> </bean>
上述程式碼設定了支援最大的上傳大小為100M,如果檔案超出大小,則會報錯,會丟擲org.springframework.web.multipart.MaxUploadSizeExceededException,而這個時候,程式碼還沒有執行到我們的Controller中,所以最好再配置一個異常處理解析器。如下:
<!-- 該異常是SpringMVC在檢查上傳的檔案資訊時丟擲來的,而且此時還沒有進入到Controller方法中 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到XXX頁面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">跳轉頁面URL</prop> </props> </property> </bean>
到這裡我們需要配置的資訊就完事了,接下來就是具體的開發了,是不是好期待呀???
三、編寫上傳頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上傳檔案</title> </head> <body> <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"> 上傳檔案:<input type="file" name="file"> <input type="submit" value="上傳"> </form> </body> </html>
頁面比較簡陋,大家不要介意,這裡主要講解功能。
四、編寫上傳Controller
package cn.itechyou.upload.controller; import java.io.File; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller public class TestUploadController { /** * 單檔案上傳 * @param file * @param request * @return */ @RequestMapping(value = "/upload.do") public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { if (!file.isEmpty()) { String type = file.getOriginalFilename().substring( file.getOriginalFilename().indexOf("."));// 取檔案格式字尾名 String filename = System.currentTimeMillis() + type;// 取當前時間戳作為檔名 String path = request.getSession().getServletContext() .getRealPath("/upload/" + filename);// 存放位置 File destFile = new File(path); try { FileUtils.copyInputStreamToFile(file.getInputStream(), destFile);// 複製臨時檔案到指定目錄下 } catch (IOException e) { e.printStackTrace(); } return "redirect:ok.jsp"; } else { return "redirect:error.jsp"; } } /** * 多檔案上傳 * @param request * @param files * @return */ @RequestMapping(value = "uploads", method = RequestMethod.POST) public String uploads(HttpServletRequest request, @RequestParam("files") MultipartFile[] files){ StringBuilder sb = new StringBuilder(); if(files != null && files.length > 0){ for (MultipartFile file : files) { if (!file.isEmpty()) { String type = file.getOriginalFilename().substring( file.getOriginalFilename().indexOf("."));// 取檔案格式字尾名 String filename = System.currentTimeMillis() + type;// 取當前時間戳作為檔名 String path = request.getSession().getServletContext() .getRealPath("/upload/" + filename);// 存放位置 File destFile = new File(path); try { FileUtils.copyInputStreamToFile(file.getInputStream(), destFile);// 複製臨時檔案到指定目錄下 sb.append("1"); } catch (IOException e) { sb.append("0"); e.printStackTrace(); } } else { sb.append("0"); } } } //這裡做個判斷,如果上傳檔案中有上傳失敗的,則返回錯誤頁面 if(sb.toString().contains("0")){ return "redirect:error.jsp"; } return "redirect:ok.jsp"; } }
到這裡檔案上傳就完事了。大家可以測試一下。這裡我就不貼上測試圖片了。