jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势
看過之前的蛻變系列文章,相信你對springMVC有了一定的認識。對springMVC的異常處理,也有了一定的認識。今天我們來開啟新討論,講一講web開發中會經常遇到的一個功能,文件上傳。
猿蛻變同樣是一個原創系列文章,幫助你從一個普通的小白,開始掌握一些行業內通用的框架技術知識以及鍛煉你對系統設計能力的提升,完成屬于你的蛻變,更多精彩內容,還是私信我吧,黑機構太多,老是舉報我,大號都被封號了(由此可見對這些黑機構的傷害有多深)。
文件上傳這種小事情,我們自然不用擔心啦。SpringMVC提供了強有力的支持,不會讓你退化到使用request的inputStram的老路上去噠。一般來說,使用commons組件就輕松搞定啦。
我們在講文件上傳文件的功能之前,先做一點準備工作啦,我們先在webapp目錄下創建一個名為upload的文件夾用于存放上傳的文件。
然后,再編寫一個文件上傳的表單頁面upload.jsp文件,增加一個表單即可。
<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%> <!DOCTYPE html > <html> <head> <title>Spring MVC 文件上傳樣例</title> </head> <body><form action="upload.do" enctype="multipart/form-data"method=post id="picForm"><lable>請選擇需要上傳的文件:</lable><input type="file"name="pic" id=""pic""/><br /><input type="submit"value="提交" id="submit"/><br /></form> </body>注意:上傳文件的表單需要在from標簽中加入屬性enctype="multipart/form-data",沒有這個等待你的必然是,一頓操作猛如虎,抬頭一看原地杵。
</html>顯示上傳文件的頁面showUpload.jsp <%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%> <!DOCTYPE html > <html> <head> <title>Spring MVC 文件上傳樣例</title></head> <body><img src="${path}"/> </body> </html>編寫Controller代碼
package com.pz.web.study.springmvc.controller;import java.io.File;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile;@Controller public class UploadFileControllerDemo {@RequestMapping("/upload.do")public String upload(MultipartFilepic,HttpServletRequest req,Model model) throws Exception {if(!pic.isEmpty()) {//獲取服務器上傳的文件路徑String path =req.getServletContext().getRealPath("/upload");//獲取文件名稱String filename =pic.getOriginalFilename();//限制文件上傳的類型if ("image/png".equals(pic.getContentType())||"image/jpeg".equals(pic.getContentType())||"image/jpg".equals(pic.getContentType())) {File file = new File(path, filename);//完成文件上傳pic.transferTo(file);model.addAttribute("path", "/upload"+"/"+filename);return"showUpload";}}return"../upload";}}Spring MVC提供了MultipartFile類型來接收文件類型的參數,MultipartFile是一個接口,提供了一些操作文件的方法:
getOriginalFilename() 獲取上傳文件的文件名
isEmpty() 用于判斷是否有文件上傳,如果有文件上傳返回true
getContentType() 獲取上傳文件類型
transferTo(File file) 將文件上傳寫入磁盤。
getName() 獲取表單中input標簽里的name屬性值。
getBytes() 以byte數組的形式返回上傳文件。
getInputStream() 返回上傳文件的InputStram對象。
req.getServletContext().getRealPath("/upload")用于獲取上傳文件被存放的目錄,其中getRealPath中的路徑相對于應用的webapp目錄算起的,不要搞錯了噢。
修改pom.xml引入commons相關依賴:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><artifactId>commons-fileupload</artifactId><groupId>commons-fileupload</groupId><version>1.3.3</version></dependency></dependencies>修改spring-servlet.xml增加配置
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--設置字符編碼防止文件名亂碼--><property name="defaultEncoding"value="utf-8"/><!--設置上傳文件的總大小,單位是字節b--><property name="maxUploadSize"value="2048576"/><!--設置內存緩沖區的大小,當超過該值的時候會寫入到臨時目錄--><property name="maxInMemorySize"value="2048576"/><!--設置臨時目錄--><property name="uploadTempDir"value="temp"/><!--默認是false,如果設置為true的話,不會將文件路徑去除--><property name="preserveFilename"value="false"/><!--是否使用懶加載,默認是false--><property name="resolveLazily"value="true"/> </bean>啟動應用,訪問http://127.0.0.1/upload.jsp。蘑菇頭,趕緊選擇一張好看的圖片,上傳吧。
當上傳的文件文件超出配置時指定的大小,應用程序會拋出異常——MaxUploadSizeExceededException。我們之前已經學習過SpringMVC的相關異常處理了,這里就不再重復講了。
上傳多個文件與單個文件最主要的區別是在于,Controller中接收文件的參數類型為MultipartFile的數組,即MultipartFile[] 并且需要加上annotation——@RequestParam。上傳多個文件的頁面input標記要設置相同的name屬性值。我們看下面這個例子:
編寫用于上傳的jsp頁面 uploadMultiFile.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"isELIgnored="false"%> <!DOCTYPE html > <html> <head> <title>Spring MVC 文件上傳樣例</title></head> <body><form action="uploadMultiFile.do"enctype="multipart/form-data" method=post id="picForm"><lable>請選擇需要上傳的文件:</lable><input type="file"name="pics" id=""pic""/><br /><input type="file"name="pics" id=""pic""/><br /><input type="submit"value="提交" id="submit"/><br /></form> </body> </html>編寫Controller代碼,在UploadFileControllerDemo中新增方法
@RequestMapping("/uploadMultiFile.do")public String uploadMultiFile(@RequestParam("pics") MultipartFile[] pics, HttpServletRequest req,Model model) throws Exception {if (null != pics || pics.length < 2) {List<String> paths= new LinkedList<String>();for (MultipartFile pic : pics) {// 獲取服務器上傳的文件路徑String path =req.getServletContext().getRealPath("/upload");// 獲取文件名稱String filename =pic.getOriginalFilename();// 限制文件上傳的類型if ("image/png".equals(pic.getContentType())|| "image/jpeg".equals(pic.getContentType())|| "image/jpg".equals(pic.getContentType())) {File file = new File(path, filename);// 完成文件上傳pic.transferTo(file);paths.add("/upload" + "/" +filename);}}model.addAttribute("paths", paths);return"showUploadMultiFile";}return"../uploadMultiFile";}再次強調一下,@RequestParam("pics") MultipartFile[] 注意參數類型 和annotation的值,必須和頁面input標記的name屬性值匹配!
啟動應用,訪問http://127.0.0.1/uploadMultiFile.jsp,上傳多個文件試試吧。
總結
以上是生活随笔為你收集整理的jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字母大小写排序_Python
- 下一篇: Vjudge