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

前言

文件的上傳和下載是項目開發(fā)中非常常見的功能检碗,例如圖片、郵件附件的上傳與下載球订,下載與上傳音頻后裸、視頻等。

1. 文件上傳

1.1 文件上傳介紹

文件上傳是通過表單的形式提交給服務(wù)器的冒滩,因此,實現(xiàn)文件的上傳浪谴,就需要一個提供上傳的表單开睡,而這個表單則必須滿足以下三個條件。

  • form表單的method屬性為post
  • form表單的enctype屬性為multipart/form-data
  • 使用<input type="file" name="filename"/>為文件上傳輸入框

示例代碼如下:

<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="photo" multiple>
    <input type="submit" value="上傳"/>
</form>

注意:使用 multiple 屬性苟耻,則可以同時選擇多個文件上傳篇恒。
enctype=multipart/form-data:該屬性表明發(fā)送的請求體的內(nèi)容是多表單元素的,通俗點講凶杖,就是有各種各樣的數(shù)據(jù)胁艰,可能有二進制數(shù)據(jù),也可能有表單數(shù)據(jù)智蝠。當使用該屬性時腾么,瀏覽器就會采用二進制流的方式來處理表單數(shù)據(jù),服務(wù)器端就會對文件上傳的請求進行解析處理杈湾。

1.2 文件上傳實現(xiàn)

1.2.1 添加依賴

Spring NVC 的文件上傳需要依賴Apache Commons FileUpload的組件解虱,即需要添加支持文件上傳的依賴。

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

1.2.2 配置上傳解析器

Spring MVC 為文件的上傳提供了直接的支持漆撞,而這個支持是通過MultipartResolver對象實現(xiàn)殴泰。MultipartResolver是一個接口,需要他的實現(xiàn)類CommonsMultipartResolver來完成文件上傳浮驳。而在Spring MVC中使用該對象悍汛,只需在配置文件中定義一個MultipartResolver接口的Bean即可。

<!-- 配置文件上傳解析器至会,將上傳的文件封裝為CommonsMultipartFile -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

注意: 配置CommonsMultipartResolver時必須指定該bean的id為multipartResolver离咐。

MultipartResolver的屬性:

屬性名 作用
maxUploadSize 上傳文件的最大長度
maxInMemorySize 緩存中的最大尺寸
resolveLazily 推遲文件解析
defaultEncoding 默認編碼格式

1.2.3 通過表單上傳

<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="photo" multiple>
    <input type="submit" value="上傳"/>
</form>

1.2.4 創(chuàng)建控制器類

@Controller
public class FileUploadController {

    @RequestMapping("/fileUpload")
    public String testFileUpload(MultipartFile photo, HttpSession session) throws IOException {
        String filename = photo.getOriginalFilename();
        ServletContext servletContext = session.getServletContext();
        String realPath = servletContext.getRealPath("photo");
        File file = new File(realPath);
        //判斷realPath對應(yīng)的路徑是否存在
        if (!file.exists()){
            //不存在就創(chuàng)建
            file.mkdir();
        }
        String finalPath = realPath + File.separator + filename;
        photo.transferTo(new File(finalPath));
        return "success";
    }
}

  • 文件上傳位置:


1.2.5 上傳演示

查看上傳結(jié)果,可以看到上傳成功了7芟住=∨旺上!


2. 文件下載

2.1文件下載的實現(xiàn)

文件下載就是將文件服務(wù)器中的文件下載到本地。

2.1.1 客服端創(chuàng)建超鏈接

需要先在文件下載目錄中添加一個a.jpg文件

<a href="${pageContext.request.contextPath}/fileDownload">下載a.jpg</a>

2.1.2 創(chuàng)建控制器類

使用Spring MVC提供的文件下載方法進行文件下載糖埋,Spring MVC為我們提供了一個ResponseEntity類型的對象來實現(xiàn)文件的下載宣吱。

@Controller
public class FileDownloadController {

    @RequestMapping("/fileDownload")
    public ResponseEntity<byte[]> testFileDownload(HttpSession session) throws IOException {
        //獲取ServletContext對象
        ServletContext servletContext = session.getServletContext();
        //文件的真實路徑
        String realPath = servletContext.getRealPath("static/img/a.jpg");
        //創(chuàng)建輸入流
        InputStream inputStream = new FileInputStream(realPath);
        //創(chuàng)建字節(jié)數(shù)組
        byte[] bytes = new byte[inputStream.available()];
        //將流讀到字節(jié)數(shù)組中
        inputStream.read(bytes);
        //創(chuàng)建HttpHeaders對象,設(shè)置響應(yīng)頭信息
        MultiValueMap<String,String> headers = new HttpHeaders();
        //設(shè)置下載方式和下載文件的名稱   attachment表示以附件的形式下載
        headers.add("Content-Disposition","attachment;filename=a.jpg");
        //設(shè)置響應(yīng)狀態(tài)碼
        HttpStatus  status = HttpStatus.OK;
        //創(chuàng)建ResponseEntity對象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes,headers,status);
        //關(guān)閉輸入流
        inputStream.close();
        return responseEntity;
    }
}

2.1.3 下載演示
可以看到跟我們平時下載文件是一樣的瞳别。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末征候,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祟敛,更是在濱河造成了極大的恐慌疤坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馆铁,死亡現(xiàn)場離奇詭異跑揉,居然都是意外死亡,警方通過查閱死者的電腦和手機埠巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門历谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辣垒,你說我怎么就攤上這事望侈。” “怎么了勋桶?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵脱衙,是天一觀的道長。 經(jīng)常有香客問我例驹,道長捐韩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任眠饮,我火速辦了婚禮奥帘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仪召。我一直安慰自己寨蹋,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布扔茅。 她就那樣靜靜地躺著已旧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召娜。 梳的紋絲不亂的頭發(fā)上运褪,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼秸讹。 笑死檀咙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的璃诀。 我是一名探鬼主播弧可,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劣欢!你這毒婦竟也來了棕诵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤凿将,失蹤者是張志新(化名)和其女友劉穎校套,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牧抵,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡笛匙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灭忠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳算。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弛作,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情华匾,我是刑警寧澤映琳,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜘拉,受9級特大地震影響萨西,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旭旭,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一谎脯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧持寄,春花似錦源梭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模庐,卻和暖如春烛愧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工怜姿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慎冤,地道東北人示血。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓喇肋,卻偏偏與公主長得像顽铸,于是被迫代替她去往敵國和親皂岔。 傳聞我的和親對象是個殘疾皇子麸锉,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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