文件上傳下載
在做文件上傳的時候,會有一個上傳文件的界面酱床,首先我們需要一個表單羊赵,
并且表單的請求方式為 POST;其次我們的 form 表單的 enctype 必須設
為”multipart/form-data”即 enctype="multipart/form-data"意思是設置表單的
MIME 編碼斤葱。默認情況下這個編碼格式是”application/x-www-form-urlencoded”,
不能用于文件上傳慷垮;只有使用了 multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。
</form>
后臺 commons-fileupload的使用
首先需要導入第三方 jar 包揍堕,http://commons.apache.org/ 下載
commons-io 和 commons-fileupload 兩個 jar 的資源料身。解壓并導入到項目中。
commons-fileupload.jar是文件上傳的核心包 commons-io.jar 是 filefupload 的
依賴包衩茸,同時又是一個工具包芹血。
DiskFileItemFactory–設置磁盤空間,保存臨時文件楞慈。只是一個工具類
ServletFileUpload–文件上傳的核心類幔烛,此類接收 request,并解析
ServletFileUpload.parseRequest(request);– List 解析 request
1囊蓝、創(chuàng)建一個DiskFileItemFactory 工廠類饿悬,并制定臨時文件和大小
2、創(chuàng)建ServletFileUpload 核心類聚霜,接收臨時文件狡恬,做請求的轉換
3、通過ServletFileUpload 類轉換原始請求蝎宇,得到 FileItem 集合
4弟劲、遍歷集合中的各個元素并處理
5、判斷每個元素是否是普通表單項姥芥,如果是則按照普通表單項處理
6兔乞、如果不是普通表單項,則是文件,通過處理的方式進行處理(上傳)
超鏈接下載
當我們在 HTML 或 JSP 頁面中使用標簽時庸追,原意是希望能夠進行跳轉霍骄,但
當超鏈接遇到瀏覽器不識別的動態(tài)網(wǎng)頁時則會自動下載。例如超鏈接下載但當遇
見瀏覽器能夠直接顯示的資源锚国,瀏覽器就會默認顯示出來腕巡,比如 txt,png,jpg 等。
當然我們也可以通過 download 屬性規(guī)定瀏覽器進行下載血筑。但有些瀏覽器并不支
持绘沉。
默認下載
超鏈接下載</a>
指定download屬性下載
超鏈接下載</a>
這里,download 也可以不寫任何信息豺总,會自動使用默認文件名车伞。這樣當用
戶打開瀏覽 器點擊鏈接的時候就會直接下載文件。
后臺實現(xiàn)下載
Step1:需要通過 HttpServletResponse.setContentType 方法設置 Content-type
頭字段的值喻喳,為瀏覽器無法使用某種方式或激活某個程序來處理的 MIME 類型另玖,
例如”application/octet-stream”或”application/x-msdownload”等
Step2:需要通過 HttpServletResponse.setHeader 方法設置
Content-Disposition頭的值為”attachment;filename=文件名”
Step3: 讀取下載文件,調(diào)用 HttpServletResponse.getOutputStream 方法返回
的 OutputStream 對象來向客戶端寫入附件內(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())
{
// 設置相應類型 application/octet-stream
resp.setContentType("application/x-msdownload");
// 設置頭信息
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);
}
// 關閉流谦去、釋放資源
os.close();
is.close();
} else {
System.out.println("文件不存在,下載失敱暮摺鳄哭!");
}
}
}