1.文件上傳
文件上傳是項目開發中常用的功能。為了能上傳文件,必須將表單的method設置為POST,並將enctype設置為multipart/form-data。只有在這種情況下,瀏覽器才會把用戶選擇的文件二進制數據發送給服務器。
Spring MVC為文件上傳提供了直接的支持,這種支持是用即插即用的MultipartResolver實現的。Spring MVC使用Apache Commons fileupload技術實現了一個MultipartResolver實現類:CommonsMultipartResolver.所以Spring MVC的文件上傳依賴Apache Commons fileupload的組件。
2.MultipartFile
Spring MVC會將上傳文件綁定到MultipartFile對象中,該對象提供了獲取上傳文件內容,文件名等方法。通過transferTo()方法還可以將文件存儲到硬件中。
MultipartFile常用方法如下:
*bye[] getBytes() :獲取文件數據
*String getContentType() :獲取文件MIME類型
*InputStream getIputStream() :獲取文件流
*String getName() :獲取表單中文件組件的名字
*String getOriginalFilename() :獲取上傳文件的原名
*boolean isEmpty() :是否有上傳的文件
*void transferTo(File dest) :將文件保存到一個目標文件中
3.實例
3.1創建一個項目,導入相應的jar包,包括Apache的Commons FileUpload的jar包
3.2編寫web.xml和springmvc-config.xml
<!-- 配置前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
<!-- spring可以自動去掃描base-package下面的包或者子包下面的java類 如果掃描到有spring相關注解的類,則吧這個類注冊為spring的bean --> <context:component-scan base-package="com.dj.controller" /> <!-- 配置MultipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 上傳文件大小限制,單位為字節-10Mb --> <property name="maxUploadSize"> <value>10485760</value> </property> <!-- 請求的編碼格式 --> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean> <!-- 默認裝配 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前綴 --> <property name="prefix"> <value>/</value> </property> <!-- 后綴 --> <property name="suffix"> <value>.jsp</value> </property> </bean>
3.3編寫一個上傳文件的實體類
private String username; //對應上傳文件的file,類型為multipartfile,上傳文件會自動綁定到image屬性中 private MultipartFile image;
3.3編寫controller
@Controller public class FileUploadController { /** * 動態跳轉頁面 * @param pagename * @return */ @RequestMapping(value="/{pagename}") public String toPage(@PathVariable String pagename){ return pagename; } @RequestMapping(value="regist") public String regist(HttpServletRequest request, @ModelAttribute User user,Model model) throws Exception, IOException{ if(!user.getImage().isEmpty()){ //文件上傳路徑 String path = request.getServletContext().getRealPath("/images/"); //上傳文件名 String filename = user.getImage().getOriginalFilename(); File filepath = new File(path, filename); //判斷路徑是否存在 if(!filepath.getParentFile().exists()){ filepath.getParentFile().mkdirs(); } //將上傳文件保存到一個目標文件中 user.getImage().transferTo(new File(path+File.separator+filename)); model.addAttribute("user", user); return "userinfo"; } return "error"; } }
3.4編寫注冊頁面和顯示信息頁面
<form action="regist" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="username"/><br> 請上傳頭像:<input type="file" name="image"><br> <input type="submit" vaue="注冊"> </form>
<a href="download?filename=${requestScope.user.image.originalFilename }"> ${requestScope.user.image.originalFilename } </a>
3.5測試
在瀏覽器中輸入如下地址
http://localhost:8888/FileUploadTest/registPage
點擊提交,可以看到
這個文件的保存位置在你工作空間\.metadata\.plugins\org.eclipse.wst.server.core\的一個tmp下的\wtpwebapps\FileUploadTest\images\這個目錄下
你可以在控制台打印保存文件路徑位置再根據路徑去本地找
想看到文件具體位置可以把上傳文件位置改為
user.getImage().transferTo(new File("D:\\"+filename));
這時候就可以在d盤下面看到上傳的文件
源碼下載地址:https://files.cnblogs.com/files/dj-blog/FileUploadTest.zip
接下來我們再看文件下載:http://www.cnblogs.com/dj-blog/p/7535340.html