2019-06-11

文件上傳下載

在做文件上傳的時(shí)候,會(huì)有一個(gè)上傳文件的界面,首先我們需要一個(gè)表單,

并且表單的請(qǐng)求方式為 POST;其次我們的 form 表單的 enctype 必須設(shè)

為”multipart/form-data”即 enctype="multipart/form-data"意思是設(shè)置表單的

MIME 編碼。默認(rèn)情況下這個(gè)編碼格式是”application/x-www-form-urlencoded”,

不能用于文件上傳;只有使用了 multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。

</form>


后臺(tái) commons-fileupload的使用

首先需要導(dǎo)入第三方 jar 包,http://commons.apache.org/ 下載

commons-io 和 commons-fileupload 兩個(gè) jar 的資源。解壓并導(dǎo)入到項(xiàng)目中。

commons-fileupload.jar是文件上傳的核心包 commons-io.jar 是 filefupload 的

依賴(lài)包,同時(shí)又是一個(gè)工具包。


DiskFileItemFactory–設(shè)置磁盤(pán)空間,保存臨時(shí)文件。只是一個(gè)工具類(lèi)

ServletFileUpload–文件上傳的核心類(lèi),此類(lèi)接收 request,并解析

ServletFileUpload.parseRequest(request);– List 解析 request

1、創(chuàng)建一個(gè)DiskFileItemFactory 工廠類(lèi),并制定臨時(shí)文件和大小

2、創(chuàng)建ServletFileUpload 核心類(lèi),接收臨時(shí)文件,做請(qǐng)求的轉(zhuǎn)換

3、通過(guò)ServletFileUpload 類(lèi)轉(zhuǎn)換原始請(qǐng)求,得到 FileItem 集合

4、遍歷集合中的各個(gè)元素并處理

5、判斷每個(gè)元素是否是普通表單項(xiàng),如果是則按照普通表單項(xiàng)處理

6、如果不是普通表單項(xiàng),則是文件,通過(guò)處理的方式進(jìn)行處理(上傳)


超鏈接下載

當(dāng)我們?cè)?HTML 或 JSP 頁(yè)面中使用標(biāo)簽時(shí),原意是希望能夠進(jìn)行跳轉(zhuǎn),但

當(dāng)超鏈接遇到瀏覽器不識(shí)別的動(dòng)態(tài)網(wǎng)頁(yè)時(shí)則會(huì)自動(dòng)下載。例如超鏈接下載但當(dāng)遇

見(jiàn)瀏覽器能夠直接顯示的資源,瀏覽器就會(huì)默認(rèn)顯示出來(lái),比如 txt,png,jpg 等。

當(dāng)然我們也可以通過(guò) download 屬性規(guī)定瀏覽器進(jìn)行下載。但有些瀏覽器并不支

持。

默認(rèn)下載

超鏈接下載</a>

指定download屬性下載

超鏈接下載</a>

這里,download 也可以不寫(xiě)任何信息,會(huì)自動(dòng)使用默認(rèn)文件名。這樣當(dāng)用

戶打開(kāi)瀏覽 器點(diǎn)擊鏈接的時(shí)候就會(huì)直接下載文件。


后臺(tái)實(shí)現(xiàn)下載

Step1:需要通過(guò) HttpServletResponse.setContentType 方法設(shè)置 Content-type

頭字段的值,為瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類(lèi)型,

例如”application/octet-stream”或”application/x-msdownload”等

Step2:需要通過(guò) HttpServletResponse.setHeader 方法設(shè)置

Content-Disposition頭的值為”attachment;filename=文件名”

Step3: 讀取下載文件,調(diào)用 HttpServletResponse.getOutputStream 方法返回

的 OutputStream 對(duì)象來(lái)向客戶端寫(xiě)入附件內(nèi)容。





public class

DownloadServlet extends HttpServlet {

private static

final long serialVersionUID = 1L;

protected void

service(HttpServletRequest req, HttpServletResponse resp)

throws

ServletException, IOException {

req.setCharacterEncoding("UTF-8");

// 獲取文件下載路徑

String path =

getServletContext().getRealPath("/") + "download/";

String fileName

= req.getParameter("filename");

File file = new

File(path + fileName);

if (file.exists())

{

// 設(shè)置相應(yīng)類(lèi)型 application/octet-stream

resp.setContentType("application/x-msdownload");

// 設(shè)置頭信息

resp.setHeader("Content-Disposition",

"attachment;filename=" +

fileName);

InputStream is =

new FileInputStream(file);

ServletOutputStream

os = resp.getOutputStream();

byte[] car = new

byte[1024];

int len = 0;

while ((len =

is.read(car)) != -1) {

os.write(car, 0,

len);

}

// 關(guān)閉流、釋放資源

os.close();

is.close();

} else {

System.out.println("文件不存在,下載失??!");

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文包括:1、文件上傳概述2、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,745評(píng)論 5 91
  • Android實(shí)現(xiàn)高性能的幀動(dòng)畫(huà)禮物播放效果 引言:我們都知道Android實(shí)現(xiàn)動(dòng)畫(huà)的常見(jiàn)方式有那么幾種,比如屬性...
    遙望星空f(shuō)orward閱讀 873評(píng)論 0 0
  • 過(guò)濾器 Filter 即為過(guò)濾,用于在 Servlet 之外對(duì) Request 或者 Response 進(jìn)行修改。...
    1fa38a6a3bcf閱讀 236評(píng)論 0 0
  • 寫(xiě)后記:2017/11/22最近因?yàn)榧ろ?xiàng)目需要做校園網(wǎng)的課表、成績(jī)查詢功能,不得不使用模擬請(qǐng)求,去請(qǐng)求uims教...
    大海畫(huà)家閱讀 1,304評(píng)論 0 2
  • 今天,下著蒙蒙的細(xì)雨,帶著初春的涼爽,我行走在路上,感覺(jué)很好,我體驗(yàn)細(xì)雨綿綿的親妮,又是美好的一天! 每一天都是宇...
    宗至杬閱讀 432評(píng)論 0 0

友情鏈接更多精彩內(nèi)容