JavaWeb---servlet案例之:下載頁面

該篇講述如何使用eclipse構建一個Javaweb項目,下載服務器中的文件

File-New-Dynamic Web Project
在這裏插入圖片描述

在新彈出來的對話框中填寫好名字,並且版本號選擇2.5,點擊Finish
在這裏插入圖片描述

在Java Resources-src文件夾下,創建包cn.itclass.content,在該包下創建名爲DownloadServlet.java的class文件,輸入以下內容:

package cn.itclass.content;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

/**
 * 
 * @author Damien
 * @date 2018年9月25日
 * @parameter 	功能:下載文件 
 * 				備註:有防止亂碼的功能
 */
public class DownloadServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// 1、獲得要下載的文件的名稱
		String filename = request.getParameter("filename");

		// 2、解決獲得中文參數的代碼
		filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");

		// 3、獲得請求頭中的User-Agent
		String agent = request.getHeader("User-Agent");

		// 4、根據不同瀏覽器進行不同的編碼(第四步爲模板代碼,非所有瀏覽器適用)
		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");
		}

		// 5、要下載的這個文件的類型------客戶端通過文件的MIME類型區別
		response.setContentType(this.getServletContext().getMimeType(filename));

		// 6、告訴客戶端,該文件不是直接解析,而是以附件形式打開(下載)
		// 此行能夠設置下載時默認的文件名字
		response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);

		// 7、獲得filename的絕對地址
		String realPath = this.getServletContext().getRealPath("download/" + filename);

		// 8、獲取該文件的輸入流
		InputStream inputStream = new FileInputStream(realPath);

		// 9、獲得輸出流,通過response獲得的輸出流,用於向客戶端寫內容
		ServletOutputStream outputStream = response.getOutputStream();

		// 10、文件拷貝的模板代碼
		int len = 0;
		byte[] buffer = new byte[1024];
		while ((len = inputStream.read(buffer)) > 0) {
			outputStream.write(buffer, 0, len);
		}

		// 11、關閉流
		inputStream.close();
		outputStream.close();// 一般不寫,服務器會自動幫你關上
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

在WebConten文件夾下創建download.html,內容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>使用a標籤直接指向服務器上的資源</h1>
	<a href="/WEB14/download/a.flv">a.flv</a><br /><br />
	<a href="/WEB14/download/a.jpg">a.jpg</a><br /><br />
	<a href="/WEB14/download/a.mp3">a.mp3</a><br /><br />
	<a href="/WEB14/download/a.mp4">a.mp4</a><br /><br />
	<a href="/WEB14/download/a.txt">a.txt</a><br /><br />
	<a href="/WEB14/download/a.zip">a.zip</a><br /><br />
	
	<h1>使用服務器編碼的方式實現文件下載</h1>
	<a href="/WEB14/downloadServlet?filename=a.flv">a.flv</a><br /><br />
	<a href="/WEB14/downloadServlet?filename=a.jpg">a.jpg</a><br /><br />
	<a href="/WEB14/downloadServlet?filename=a.mp3">a.mp3</a><br /><br />
	<a href="/WEB14/downloadServlet?filename=a.mp4">a.mp4</a><br /><br />
	<a href="/WEB14/downloadServlet?filename=a.txt">a.txt</a><br /><br />
	<a href="/WEB14/downloadServlet?filename=美女.jpg">美女.jpg</a><br /><br />
	
</body>
</html>

再把相關的文件拷貝到WebConten下的download文件夾下。整體目錄樹如下所示:
在這裏插入圖片描述

然後選中WEB_TEST,右鍵單擊,選擇Run As -Run on Server
在這裏插入圖片描述
在瀏覽器中輸入http://localhost/WEB_TEST/download.html,進行下載
在這裏插入圖片描述

該代碼可以解決文件名爲中文時無法下載的毛病,並且下載時會自動命名爲服務器中存儲的文件名,可以作爲demo存儲,已放置到github上,可自行下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章