1. 程式人生 > >簡單實現從瀏覽器下載檔案

簡單實現從瀏覽器下載檔案

最容易出錯到點

  • JDBC連線資料庫卻忘記導包:mysql-connector-java-5.1.7-bin.jar
  • 使用Servlet卻忘記導tomcat的包:servlet-api.jar,這個包在tomcat/lib中找到
  • 自己手寫Servlet卻忘記到web.xml中寫配置

登陸頁面實現

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head
>
<body> <form action = "Login_Servlet" method = "get"> 使用者名稱:<input type = "text" name = username /><br> 密碼:<input type = "text" name = password /><br> <input type = "submit" value = "登陸"> <input type = "button" value = "註冊" onclick="javascrtpt:window.location.href='register.html'"> </
form
>
</body> </html>

登陸對應的Servlet

package vipdownload;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet.
ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Login_Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 制定編碼表 resp.setContentType("text/html;charset=utf-8"); // 獲取頁面登入名與密碼 ArrayList<String> list = new ArrayList<>(); Enumeration<String> parameterNames = req.getParameterNames(); while (parameterNames.hasMoreElements()) { String key = (String) parameterNames.nextElement(); list.add(req.getParameter(key)); } // 校驗登入名與密碼是否存在於資料庫中 Connection conne = JDBC_util.getConnetion(); PreparedStatement pst = null; String sql = "select * from user where username=? && password=?"; try { pst = conne.prepareStatement(sql); pst.setString(1, list.get(0)); pst.setString(2, list.get(1)); ResultSet resultSet = pst.executeQuery(); if (resultSet.next()) { // 存在,登陸成功,跳轉下載頁面 resp.setStatus(302); resp.setHeader("Location", "download.html"); } else { // 不存在,登入失敗 resp.getWriter().write("登入失敗"); } } catch (SQLException e) { e.printStackTrace(); }finally { JDBC_util.release(conne, pst); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }

註冊頁面

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>會員註冊</title>

<script>
	//獲取焦點事件
	function checkTips(spanId, msg) {
		var span = document.getElementById(spanId);
		span.innerHTML = msg;
	}

	//失去焦點事件,校驗使用者名稱
	function checkUserName() {
		var username = document.getElementById("username").value;
		var span = document.getElementById("span_username");
		if (username.length > 13 || username.length < 3) {
			span.innerHTML = "<font color = 'red' size = '2'>使用者名稱長度不符合</font>";
		} else {
			span.innerHTML = "<font color = 'red' size = '2'>使用者名稱可用</font>";
			return true;
		}

	}

	//失去焦點事件,校驗密碼
	function checkPassWord() {
		var password = document.getElementById("password").value;
		var span = document.getElementById("span_password");
		if (password.length < 6) {
			span.innerHTML = "<font color='red' size='2'>密碼長度小於6位</font>";
		} else {
			span.innerHTML = "<font color='red' size='2'>密碼可用</font>";
			return true;
		}
	}

	//失去焦點事件,校驗確認密碼
	function checkRePassWord() {
		var repassword = document.getElementById("repassword").value;
		var password = document.getElementById("password").value;
		var span = document.getElementById("span_repassword");
		if (password == repassword) {
			span.innerHTML = "<font color = 'red' size = '2'>密碼一致</font>"
			return true;
		} else {
			span.innerHTML = "<font color = 'red' size = '2'>密碼不一致</font>"
		}
	}

	//表單提交事件
	function checkFrom() {
		var flag = checkUserName() && checkPassWord() && checkRePassWord();
		if (flag) {
			return flag;
		}
		return false;
	}
</script>

</head>
<body>
	<form action="Register_Servlet" method="get" onsubmit="checkFrom()">
		使用者名稱:<input type="text" id="username" name="username"
			onfocus="checkTips('span_username','使用者名稱取值為3-12個字元')"
			onblur="checkUserName()" onkeyup="checkUserName()"><span id="span_username"></span><br> 
			
		密碼:<input type="text" name="password"
			id=password onfocus="checkTips('span_password','密碼長度必須大於等於6')"
			onblur="checkPassWord()" onkeyup="checkPassWord()"><span id="span_password"></span><br> 
			
		確認密碼:<input type="text" name="repassword"
			id=repassword onfocus="checkTips('span_repassword','密碼必須一致')"
			onkeyup="checkRePassWord()" onblur="checkRePassWord()"><span id="span_repassword"></span><br> 
			
		<input type="submit" value="註冊">
	</form>

</body>
</html>

註冊對應到Servlet

package vipdownload;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Enumeration;
import java.util.Timer;
import java.util.TimerTask;

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

//註冊校驗

public class Register_Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 判斷使用者名稱是否符合規則
		resp.setContentType("text/html;charset=utf-8");

		// 獲取資料連線物件
		Connection conne = JDBC_util.getConnetion();
		
		//資料庫操作物件
		PreparedStatement pst = null;
		
		//資料庫返回資料物件
		ResultSet rs = null;
		
		
		try {
			
			//sql查詢語句
			String sql = "select * from user where username=?";
			
			//預處理sql語句
			pst = conne.prepareStatement(sql);
			
			//設定第一個?的值
			pst.setString(1, req.getParameter("username"));
			System.out.println(req.getParameter("username"));
			
			//獲取資料庫返回值
			rs = pst.executeQuery();
			
			//判斷是否存在資料
			if (rs.next()) {
				resp.getWriter().write("使用者名稱已存在!");
			} else {
				resp.getWriter().write("註冊成功!");
				
				//將註冊資訊儲存到資料庫
				String username = req.getParameter("username");
				String password = req.getParameter("password");
				
				//SQL語句
				String insertSQL = "insert into user values(null,?,?,null)";
				
				PreparedStatement pst2 = conne.prepareStatement(insertSQL);
				
				//給佔位符賦值
				pst2.setString(1, username);
				pst2.setString(2, password);
				
				//將資料插入資料庫
				pst2.executeUpdate();
				
				
				//重新定向url
				resp.setStatus(302);

				//指向新到url地址
				resp.setHeader("Location", "download.html");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//釋放資源
			JDBC_util.release(conne, pst, rs);
		}

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

下載頁面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href = "DownLoad_Servlet?name=我很幸福.mkv">我很幸福.mkv</a><br>
<a href = "DownLoad_Servlet?name=歌詞.cfg">歌詞.cfg</a><br>
<a href = "DownLoad_Servlet?name=美女.jpg">美女.jpg</a><br>
</body>
</html>

下載頁面對應的Servlet

package vipdownload;

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

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

public class DownLoad_Servlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//		resp.setContentType("text/html;charset=utf-8");

		// 獲取頁面元素對應到檔名
		String filename = req.getParameter("name");

		// 獲取檔案在tomcat中到絕對路徑
		String path = getServletContext().getRealPath("DownLoad/" + filename);

		// 設定編碼格式,get帶過來到是UTF-8格式的,tomcat向客戶端寫出時ISO-8859-1格式的
//		filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
		
		//效果同上
		filename = URLEncoder.encode(filename, "UTF-8");

	/*	// 獲取瀏覽器型別
		String clientType = req.getHeader("User-Agent");

		// 根據不同的瀏覽器設定編碼表
		if (clientType.contains("Firefox")) {
			// 如果瀏覽器是Firefox火狐

			BASE64Encoder base64Encoder = new BASE64Encoder();
			
			filename = "=?UTF-8?B?" + new String(base64Encoder.encode(filename).getBytes("UTF-8")) + "?=";
			
		} else {
			// 如果瀏覽器實IE或者chrome
			filename = URLEncoder.encode(filename, "UTF-8");
		}*/

		// 設定響應頭,告知瀏覽器下載檔案
		resp.setHeader("Content-Disposition", "attachment;filename=" + filename);

		// 下載檔案
		InputStream is = new FileInputStream(path);

		OutputStream os = resp.getOutputStream();
		byte[] arr = new byte[1024 * 8];
		int len = 0;

		while ((len = is.read(arr)) != -1) {
			os.write(arr, 0, len);
		}

		os.close();
		is.close();

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);

	}
}