javascript
SpringMVC实现文件的上传与下载
文件的上傳與下載可以說是工作中經(jīng)常使用的功能,現(xiàn)在整理一下,希望能夠給大家一個(gè)參考。這里以 Maven 的形式來創(chuàng)建項(xiàng)目,相關(guān)的配置文件會(huì)把主要的內(nèi)容列出來,其他頭文件信息不再一一全部的列出。最后會(huì)把代碼 GitHub 地址貼出來,如果有的小伙伴需要完整的配置信息,可以參考。
一、環(huán)境準(zhǔn)備
1.1在pom.xml中添加對(duì)應(yīng)的依賴
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.16.RELEASE</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency>1.2在web.xml中配置前端控制器與編碼過濾器
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 編碼過濾器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>1.3配置SpringMVC的配置文件spring-mvc.xml
SpringMVC 提供了MultipartResolver來實(shí)現(xiàn)文件的上傳功能,MultipartResolver是一個(gè)接口,實(shí)現(xiàn)類有兩個(gè):
SpringMVC 并沒有裝配這兩個(gè)實(shí)現(xiàn)類,所以需要我們自動(dòng)配置,這里以CommonsMultipartResolver為例。
二、文件上傳
分析:圖片上傳成功后隨即跳轉(zhuǎn)到文件下載頁面,為了簡單的實(shí)現(xiàn)功能,上傳與下載并沒有與數(shù)據(jù)庫交互,可以根據(jù)需求將文件上傳的路徑存在數(shù)據(jù)庫中,顯示與下載文件的時(shí)候再向數(shù)據(jù)庫中得到文件所在的路徑。
2.1編寫文件上傳相關(guān)的JSP
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <html> <header><title>文件上傳</title> </header> <body> <h2>文件上傳</h2><form action="upload" enctype="multipart/form-data" method="post"><table><tr><td>文件描述:</td><td><input type="text" name="description"></td></tr><tr><td>請(qǐng)選擇文件:</td><td><input type="file" name="file"></td></tr><tr><td><input type="submit" value="上傳"></td></tr></table></form> </body> </html>2.2編寫后臺(tái)控制器代碼
@RequestMapping("/upload")public String upload(HttpServletRequest request, String description, MultipartFile file) throws Exception {if(!file.isEmpty()) {// 定義文件上傳的路徑String path = request.getServletContext().getRealPath("/images/");// 獲得上傳文件名String fileName = file.getOriginalFilename();File filepath = new File(path, fileName);// 判斷路徑是否存在,如果不存在就創(chuàng)建一個(gè)if (!filepath.getParentFile().exists()) {filepath.getParentFile().mkdirs();}// 將上傳文件保存到目標(biāo)文件中file.transferTo(new File(path + File.separator + fileName));// 將上傳圖片描述信息與文件名保存在轉(zhuǎn)發(fā)域中,用于下載request.setAttribute("description", description);request.setAttribute("fileName", fileName);return "success";} else {return "error";}}(文件上傳完)
2.3上傳分析
在上傳文件的時(shí)候使用了MultipartFile對(duì)象,SpringMVC 會(huì)將上傳的文件綁定在MultipartFile對(duì)象中,這個(gè)對(duì)象提供了一些方法來獲得文件的內(nèi)容,比如:getOriginalFilename()用于獲得文件名,transferTo(File dest)用于將上傳的文件保存在目的磁盤中。下面是其所提供的方法:
三、文件下載
3.1編寫文件下載相關(guān)的JSP
success.jsp文件上傳成功后就會(huì)跳轉(zhuǎn)到該頁面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <head><title>文件下載</title> </head> <body><h2>文件上傳成功!點(diǎn)擊即可下載上傳的文件!</h2><span>${description}</span><a href="download?fileName=${fileName}"> ${fileName}</a> </body> </html>3.2編寫后臺(tái)控制器代碼
@RequestMapping(value="/download")public ResponseEntity<byte[]> download(HttpServletRequest request, String fileName)throws Exception {// 獲得下載文件路徑String path = request.getServletContext().getRealPath("/images/");// 對(duì)中文文件名進(jìn)行轉(zhuǎn)碼fileName = new String(fileName.getBytes("iso-8859-1"),"UTF-8");File file = new File(path + File.separator + fileName);// 文件下載的時(shí)候?qū)⑽募D(zhuǎn)碼成瀏覽器可以識(shí)別的 ASCIIString downLoadFileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");HttpHeaders headers = new HttpHeaders();headers.setContentDispositionFormData("attachment", downLoadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);}(文件下載完)
四、測(cè)試上傳與下載
PS:請(qǐng)忽略 tomcat 的端口號(hào),為了方便我改成了80端口,文件下載直接點(diǎn)擊對(duì)應(yīng)的連接即可。
不知道有沒有小伙伴對(duì)上傳的路徑感到困惑,文件上傳成功了,但是在當(dāng)前工程下并沒有保存文件的文件夾,其實(shí)是因?yàn)轫?xiàng)目是通過服務(wù)器運(yùn)行的(這里是 tomcat),上傳的文件并沒有消失,而是被保存在了服務(wù)器發(fā)布的項(xiàng)目中。
為了防止出現(xiàn)太多的無效代碼,省去了一些類的定義與配置文件的頭信息,如果你需要這些信息,可以到 GitHub 中查看。
GitHub 地址:https://github.com/coderjas/spring-note,springmvc-fileupload2download目錄下是這個(gè) demo 對(duì)應(yīng)的代碼。
參考博文:
https://blog.csdn.net/qian_ch/article/details/69258465
總結(jié)
以上是生活随笔為你收集整理的SpringMVC实现文件的上传与下载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mvc:default-servlet-
- 下一篇: gradle idea java ssm