文件上傳下載
在做文件上傳的時(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("文件不存在,下載失??!");
}
}
}