Spring MVC 實現(xiàn)文件的上傳和下載

SpringMVC 中桶雀,文件的上傳,是通過 MultipartResolver 實現(xiàn)的唬复。 所以矗积,如果要實現(xiàn)文件的上傳,只要在 spring-mvc.xml 中注冊相應(yīng)的 MultipartResolver 即可盅抚。

MultipartResolver 的實現(xiàn)類有兩個:

CommonsMultipartResolver

StandardServletMultipartResolver

兩個的區(qū)別:

第一個需要使用 Apache 的 commons-fileupload 等 jar 包支持漠魏,但它能在比較舊的 servlet 版本中使用。

第二個不需要第三方 jar 包支持妄均,它使用 servlet 內(nèi)置的上傳功能柱锹,但是只能在 Servlet 3 以上的版本使用。

第一個使用步驟:

/*CommonsMultipartResolver? 上傳用到的兩個包*/

"commons-fileupload:commons-fileupload:1.3.1",

"commons-io:commons-io:2.4"

如果是maven項目的話直接導入:

commons-fileupload

commons-fileupload

1.3.1

dispatcher-servlet.xml配置:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="edu.nf.ch08.controller"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <!-- 文件上傳有兩種方式丰包,一種基于Servlet3.0的上傳禁熏,一種基于 commons-upload上傳,如果使用Servlet3.0的上傳方式邑彪,可以 不需要配置MultipartResolver瞧毙,Spring默認會注冊一個 StandardServletMultipartResolver。只需要在web.xml中 啟用<multipart-config>。 如果想使用commons-upload宙彪,那么需要配置一個CommonsMultipartResolver, 且指定bean的id為multipartResolver--> <!-- 這里使用commons-upload--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 限制文件上傳的總大芯囟(單位:字節(jié)),不配置此屬性默認不限制 --> <property name="maxUploadSize" value="104857600"/> <!-- 設(shè)置文件上傳的默認編碼--> <property name="defaultEncoding" value="utf-8"/> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean></beans>

?web.xml:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 請求總控器 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcher-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping></web-app>

后臺java(上傳、下載)處理代碼:

package edu.nf.ch08.controller;import org.apache.commons.io.FileUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;import java.io.File;import java.io.IOException;/** * @author wangl * @date 2018/11/2 */@Controllerpublic class UploadController { /** * 文件上傳只需要Spring傳入一個MultipartFile對象即可释漆, * 這個對象可以獲取文件相關(guān)上傳的信息悲没。 * 一個MultipartFile表示單個文件上傳,當需要上傳多個文件時 * 只需要聲明為MultipartFile[]數(shù)組即可男图。 * @return */ @PostMapping("/upload") public ModelAndView upload(MultipartFile file){ //獲取當前系統(tǒng)用戶目錄 String home = System.getProperty("user.home"); //指定上傳的文件夾目錄 File uploadDir = new File(home + "/files"); //如果目錄不存在示姿,則創(chuàng)建 if(!uploadDir.exists()){ uploadDir.mkdir(); } //獲取上傳的文件名 String fileName = file.getOriginalFilename(); //構(gòu)建一個完整的文件上傳對象 File uploadFile = new File(uploadDir.getAbsolutePath() + "/" + fileName); try { //通過transferTo方法進行上傳 file.transferTo(uploadFile); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } //將文件名存入Model,轉(zhuǎn)發(fā)到index頁面 ModelAndView mv = new ModelAndView("index"); mv.addObject("fileName", fileName); return mv; } /** * 文件下載 * 讀取服務(wù)器本地文件并封裝為ResponseEntity對象 * 響應(yīng)客戶端,寫回的是一個字節(jié)數(shù)組 * @param fileName 文件名 * @return */ @GetMapping("/download") public ResponseEntity<byte[]> download(String fileName){ //依據(jù)文件名構(gòu)建本地文件路徑 String filePath = System.getProperty("user.home") + "/files/" + fileName; //依據(jù)文件路徑構(gòu)建File對象 File file = new File(filePath); //創(chuàng)建響應(yīng)頭對象逊笆,設(shè)置響應(yīng)信息 HttpHeaders headers = new HttpHeaders(); try { //對文件名進行重新編碼栈戳,防止在響應(yīng)頭中出現(xiàn)中文亂碼 String headerFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); //設(shè)置響應(yīng)內(nèi)容處理方式為附件,并指定文件名 headers.setContentDispositionFormData("attachment", headerFileName); //設(shè)置響應(yīng)頭類型為application/octet-stream,表示是一個流類型 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //將文件轉(zhuǎn)換成字節(jié)數(shù)組 byte[] bytes = FileUtils.readFileToByteArray(file); //創(chuàng)建ResponseEntity對象(封裝文件字節(jié)數(shù)組、響應(yīng)頭难裆、響應(yīng)狀態(tài)碼) ResponseEntity<byte[]> entity = new ResponseEntity<>(bytes, headers, HttpStatus.CREATED); //最后將整個ResponseEntity對象返回給DispatcherServlet return entity; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("文件下載失敗"); } }}

上傳文件的網(wǎng)頁html:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>文件上傳</h1> <!-- 當有文件上傳時子檀,表單的enctype必須設(shè)置為multipart/form-data --> <form method="post" action="upload" enctype="multipart/form-data"> File:<input type="file" name="file"/><br/> <input type="submit" value="submit"/> </form> </body> </html>

?
?

上傳成功后轉(zhuǎn)發(fā)的jsp(下載文件)頁面:

<%-- Created by IntelliJ IDEA. User: wangl Date: 2018/11/2 Time: 09:56 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="download?fileName=${fileName}">${fileName}</a> </body> </html>



項目結(jié)構(gòu):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乃戈,隨后出現(xiàn)的幾起案子命锄,更是在濱河造成了極大的恐慌,老刑警劉巖偏化,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镐侯,居然都是意外死亡侦讨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門苟翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來韵卤,“玉大人,你說我怎么就攤上這事崇猫∩蛱酰” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵诅炉,是天一觀的道長蜡歹。 經(jīng)常有香客問我,道長涕烧,這世上最難降的妖魔是什么月而? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮议纯,結(jié)果婚禮上父款,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好憨攒,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布世杀。 她就那樣靜靜地躺著,像睡著了一般肝集。 火紅的嫁衣襯著肌膚如雪瞻坝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天包晰,我揣著相機與錄音湿镀,去河邊找鬼。 笑死伐憾,一個胖子當著我的面吹牛勉痴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树肃,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蒸矛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胸嘴?” 一聲冷哼從身側(cè)響起雏掠,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劣像,沒想到半個月后乡话,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡耳奕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年绑青,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋群。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡闸婴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芍躏,到底是詐尸還是另有隱情邪乍,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布对竣,位于F島的核電站庇楞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柏肪。R本人自食惡果不足惜姐刁,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦味。 院中可真熱鬧聂使,春花似錦壁拉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屎蜓,卻和暖如春痘昌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炬转。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工辆苔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扼劈。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓驻啤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荐吵。 傳聞我的和親對象是個殘疾皇子骑冗,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 讀蕭紅的文字總是給我一種淡淡的感覺,很輕很飄很安靜先煎,但是冷不丁的又會抓一下你的那種贼涩,像一個歷經(jīng)滄桑的老者,有一種空...
    天外_七八個閱讀 2,370評論 0 6
  • 我們高高放起的風箏薯蝎,到最后還是讓我的“怯懦”的剪刀剪斷遥倦。 阿米爾:你是我的“兄弟”,我要不畏懼阿塞夫占锯,勇敢的向他揮...
    光明噬黑暗閱讀 288評論 0 1
  • 我不是恐于談夢想谊迄,我只是沒有夢想罷了。
    好難聽的名字閱讀 140評論 0 0
  • 轉(zhuǎn)眼之間烟央,步入大學已經(jīng)兩年半⊥嵩啵回想剛步入大學時的激情與夢想疑俭,現(xiàn)在不免迷茫了許多。兩年半的時間婿失,自己堅持著钞艇,努力著,...
    吾名孟德閱讀 214評論 0 0