jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势
看過(guò)之前的蛻變系列文章,相信你對(duì)springMVC有了一定的認(rèn)識(shí)。對(duì)springMVC的異常處理,也有了一定的認(rèn)識(shí)。今天我們來(lái)開啟新討論,講一講web開發(fā)中會(huì)經(jīng)常遇到的一個(gè)功能,文件上傳。
猿蛻變同樣是一個(gè)原創(chuàng)系列文章,幫助你從一個(gè)普通的小白,開始掌握一些行業(yè)內(nèi)通用的框架技術(shù)知識(shí)以及鍛煉你對(duì)系統(tǒng)設(shè)計(jì)能力的提升,完成屬于你的蛻變,更多精彩內(nèi)容,還是私信我吧,黑機(jī)構(gòu)太多,老是舉報(bào)我,大號(hào)都被封號(hào)了(由此可見(jiàn)對(duì)這些黑機(jī)構(gòu)的傷害有多深)。
文件上傳這種小事情,我們自然不用擔(dān)心啦。SpringMVC提供了強(qiáng)有力的支持,不會(huì)讓你退化到使用request的inputStram的老路上去噠。一般來(lái)說(shuō),使用commons組件就輕松搞定啦。
我們?cè)谥v文件上傳文件的功能之前,先做一點(diǎn)準(zhǔn)備工作啦,我們先在webapp目錄下創(chuàng)建一個(gè)名為upload的文件夾用于存放上傳的文件。
然后,再編寫一個(gè)文件上傳的表單頁(yè)面upload.jsp文件,增加一個(gè)表單即可。
<%@ 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>請(qǐng)選擇需要上傳的文件:</lable><input type="file"name="pic" id=""pic""/><br /><input type="submit"value="提交" id="submit"/><br /></form> </body>注意:上傳文件的表單需要在from標(biāo)簽中加入屬性enctype="multipart/form-data",沒(méi)有這個(gè)等待你的必然是,一頓操作猛如虎,抬頭一看原地杵。
</html>顯示上傳文件的頁(yè)面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()) {//獲取服務(wù)器上傳的文件路徑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類型來(lái)接收文件類型的參數(shù),MultipartFile是一個(gè)接口,提供了一些操作文件的方法:
getOriginalFilename() 獲取上傳文件的文件名
isEmpty() 用于判斷是否有文件上傳,如果有文件上傳返回true
getContentType() 獲取上傳文件類型
transferTo(File file) 將文件上傳寫入磁盤。
getName() 獲取表單中input標(biāo)簽里的name屬性值。
getBytes() 以byte數(shù)組的形式返回上傳文件。
getInputStream() 返回上傳文件的InputStram對(duì)象。
req.getServletContext().getRealPath("/upload")用于獲取上傳文件被存放的目錄,其中g(shù)etRealPath中的路徑相對(duì)于應(yīng)用的webapp目錄算起的,不要搞錯(cuò)了噢。
修改pom.xml引入commons相關(guān)依賴:
<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"><!--設(shè)置字符編碼防止文件名亂碼--><property name="defaultEncoding"value="utf-8"/><!--設(shè)置上傳文件的總大小,單位是字節(jié)b--><property name="maxUploadSize"value="2048576"/><!--設(shè)置內(nèi)存緩沖區(qū)的大小,當(dāng)超過(guò)該值的時(shí)候會(huì)寫入到臨時(shí)目錄--><property name="maxInMemorySize"value="2048576"/><!--設(shè)置臨時(shí)目錄--><property name="uploadTempDir"value="temp"/><!--默認(rèn)是false,如果設(shè)置為true的話,不會(huì)將文件路徑去除--><property name="preserveFilename"value="false"/><!--是否使用懶加載,默認(rèn)是false--><property name="resolveLazily"value="true"/> </bean>啟動(dòng)應(yīng)用,訪問(wèn)http://127.0.0.1/upload.jsp。蘑菇頭,趕緊選擇一張好看的圖片,上傳吧。
當(dāng)上傳的文件文件超出配置時(shí)指定的大小,應(yīng)用程序會(huì)拋出異常——MaxUploadSizeExceededException。我們之前已經(jīng)學(xué)習(xí)過(guò)SpringMVC的相關(guān)異常處理了,這里就不再重復(fù)講了。
上傳多個(gè)文件與單個(gè)文件最主要的區(qū)別是在于,Controller中接收文件的參數(shù)類型為MultipartFile的數(shù)組,即MultipartFile[] 并且需要加上annotation——@RequestParam。上傳多個(gè)文件的頁(yè)面input標(biāo)記要設(shè)置相同的name屬性值。我們看下面這個(gè)例子:
編寫用于上傳的jsp頁(yè)面 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>請(qǐng)選擇需要上傳的文件:</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) {// 獲取服務(wù)器上傳的文件路徑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";}再次強(qiáng)調(diào)一下,@RequestParam("pics") MultipartFile[] 注意參數(shù)類型 和annotation的值,必須和頁(yè)面input標(biāo)記的name屬性值匹配!
啟動(dòng)應(yīng)用,訪問(wèn)http://127.0.0.1/uploadMultiFile.jsp,上傳多個(gè)文件試試吧。
總結(jié)
以上是生活随笔為你收集整理的jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python字母大小写排序_Python
- 下一篇: c++游戏代码坦克大作战_一红一蓝多种模