Web中如何應用檔案下載
阿新 • • 發佈:2018-12-10
1.為什麼有些檔案可以下載 而有些檔案不能下載
在瀏覽器中有的瀏覽器可以自己解析 即可以下載 但有一些瀏覽器自己解析不了 就需要下載
2.什麼情況下需要在伺服器端編寫檔案下載的程式碼
瀏覽器可以解析的程式碼需要編寫檔案下載的程式碼
3.檔案下載的實質
實質就是檔案拷貝,將檔案從伺服器拷貝到瀏覽器端 檔案下載需要IO技術將伺服器端的檔案使用InputStream讀取 再使用 ServletOutputStream寫到response緩衝區中
4.使用伺服器端編碼的方式實現檔案下載
與之前的上傳圖片下載 只多了設定兩個檔案下載的頭 但是當檔案是中文的時候 會亂碼
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取請求中filename名字
String filename = request.getParameter("filename");
//設定兩個檔案下載的頭
response.setContentType(this .getServletContext().getMimeType(filename));
response.setHeader("Content-Disposition","attachment;filename="+filename);
//獲取在該目錄上檔案的真實路徑 inputStream需要使用
String realPath = this.getServletContext().getRealPath("download/"+filename);
ServletOutputStream outputStream = response.getOutputStream();
InputStream in = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0) {
outputStream.write(buffer);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.解決檔案下載檔名為中文亂碼問題
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//*******檔名稱是中文的下載*******
//獲得要下載的檔案的名稱
String filename = request.getParameter("filename");//????.jpg
//解決獲得中文引數的亂碼
filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//你好.jpg
//獲得請求頭中的User-Agent
String agent = request.getHeader("User-Agent");
//根據不同瀏覽器進行不同的編碼
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE瀏覽器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filenameEncoder = URLEncoder.encode(filename, "utf-8");
}
//要下載的這個檔案的型別-----客戶端通過檔案的MIME型別去區分型別
response.setContentType(this.getServletContext().getMimeType(filename));
//告訴客戶端該檔案不是直接解析 而是以附件形式開啟(下載)----filename="+filename 客戶端預設對名字進行解碼
response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
//獲取檔案的絕對路徑
String path = this.getServletContext().getRealPath("download/"+filename);
//獲得該檔案的輸入流
InputStream in = new FileInputStream(path);
//獲得輸出流---通過response獲得的輸出流 用於向客戶端寫內容
ServletOutputStream out = response.getOutputStream();
//檔案拷貝的模板程式碼
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//out.close();
}