文件下載(javaWeb)
1.a標籤文件下載
代碼示例:
1).前端界面
<h1>a文件下載</h1>
<a href="/26-Servlet/download/a.mp4">a.mp4</a><br/>
<a href="/26-Servlet/download/code.png">code.png</a><br/>
<a href="/26-Servlet/download/c.rar">c.rar</a>
<hr>
2).直接從後臺文件目錄WEB-INF/download文件夾中下載文件
3).存在的問題
直接點擊a.mp4,和code.png的時候是直接打開文件而不是將文件下載到本地。
2.Servlet文件下載
代碼示例:
1).前端界面
<h1>servlet文件下載</h1>
<a href="/26-Servlet/DownloadServlet?filename=a.mp4">a.mp4</a><br/>
<a href="/26-Servlet/DownloadServlet?filename=code.png">code.png</a><br/>
<a href="/26-Servlet/DownloadServlet?filename=c.rar">c.rar</a><br/>
<a href="/26-Servlet/DownloadServlet?filename=二維碼.png">二維碼.png</a><br/>
2).後臺代碼
package com.helong.download;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*******************1.接收請求參數***********************************/
// 接收文件名參數
String name = request.getParameter("filename");
System.out.println(name);
/*******************2.對接收的參數進行編碼處理**************************/
//獲取參數 ,默認會對參數進行編碼 ISO8859-1
//把亂碼轉回二進制位
byte[] bytes = name.getBytes("ISO8859-1");
//再使用UTF-8進行編碼
name = new String(bytes,"UTF-8");
System.out.println(name);
/*******************3.告訴瀏覽器響應的文件的類型*************************/
// 根據文件名來獲取mime類型
String mimeType = this.getServletContext().getMimeType(name);
// 設置 mimeType
response.setContentType(mimeType);
/*******************4.告訴瀏覽器以附件的形式下載*************************/
// 獲取客戶端信息
String agent = request.getHeader("User-Agent");
// 定義一個變量記錄編碼之後的名字
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE編碼
filenameEncoder = URLEncoder.encode(name, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐編碼
/*BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(name.getBytes("utf-8")) + "?=";*/
} else {
// 瀏覽器編碼
filenameEncoder = URLEncoder.encode(name, "utf-8");
}
// 告訴瀏覽器是以附件形式來下載 不要解析
response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
/********************5.加載文件響應給瀏覽器*************************/
// 拼接文件的路徑
String path = this.getServletContext().getRealPath("download/" + name);
// 根據path加載文件
FileInputStream in = new FileInputStream(path);
// 獲取響應的輸出
ServletOutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
// 寫到響應當中
out.write(buffer, 0, len);
}
// 關閉文件
in.close();
}
}