Servlet案例2:檔案下載,servlet案例
首先,解決兩個小問題
1.輸入中文亂碼問題
一個小Demo即可解決:
package demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設定response查詢的碼錶 //response.setCharacterEncoding("UTF-8"); //通過一個頭 Content-Type 告知用戶端使用何種碼錶 //response.setHeader("Content-Type", "text/html;charset=UTF-8"); //以上兩行可以簡寫成這樣,Tomcat自動化佈建編碼 response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); //writer.write("hello response!!!");寫英文不需要考慮編碼問題 writer.write("你好"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}View Code
2.怎麼在用戶端頁面看到圖片
用到位元組流,樣本如下:
package demo;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ByteServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 使用response獲得位元組輸出資料流 ServletOutputStream out = response.getOutputStream(); // 獲得伺服器上的圖片 String realPath = this.getServletContext().getRealPath("a.jpg"); InputStream in = new FileInputStream(realPath); // 位元組數組提高效率 int len = 0; byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}View Code
接下來是檔案下載案例:
WebContent目錄下建立download檔案夾,放入各種檔案,以供下載
這裡有兩種方式下載:
1.<a>標籤直接指向伺服器資源,瀏覽器顯示能解析的,解析不了的提供下載
這種方式只需要html代碼即可(建立download.html)
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body> <h1>使用a標籤指向伺服器上的資源</h1> <a href="/WEB4/download/a.flv">a.flv</a> <br /> <a href="/WEB4/download/a.jpg">a.jpg</a> <br /> <a href="/WEB4/download/a.flv">a.mp3</a> <br /> <a href="/WEB4/download/a.mp4">a.mp4</a> <br /> <a href="/WEB4/download/a.txt">a.txt</a> <br /> <a href="/WEB4/download/a.zip">a.zip</a> <br /> <h1>使用伺服器端編碼的方式實現檔案下載</h1> <a href="/WEB4/downloadServlet?filename=a.flv">a.flv</a> <br /> <a href="/WEB4/downloadServlet?filename=a.jpg">a.jpg</a> <br /> <a href="/WEB4/downloadServlet?filename=a.mp3">a.mp3</a> <br /> <a href="/WEB4/downloadServlet?filename=a.mp4">a.mp4</a> <br /> <a href="/WEB4/downloadServlet?filename=a.txt">a.txt</a> <br /> <a href="/WEB4/downloadServlet?filename=a.zip">a.zip</a> <br /></body></html>
View Code
2.使用伺服器端編碼的方式實現檔案下載
package demo;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DownloadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得要下載檔案名稱 String filename = request.getParameter("filename"); // 下載的檔案類型(MIME類型) response.setContentType(this.getServletContext().getMimeType(filename)); // 告訴用戶端該檔案不是直接解析 而是以附件形式開啟(下載) response.setHeader("Content-Disposition", "attachment;filename=" + filename); // 擷取檔案的絕對路徑 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(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}View Code