Servlet實現web站點文件下載功能示例
1、首先創建一個SharedFilesServlet用于返回一個文件分享界面
package com.hyman.view;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;
/**
Servlet implementation class SharedFilesServlet */ public class SharedFilesServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/**
@see HttpServlet#HttpServlet() */ public SharedFilesServlet() { super(); // TODO Auto-generated constructor stub }
/**
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<script type='text/javascript' language='javascript'>"
+ "function fileDown(obj){" + "var resourceName = '';" + "var buttonId = obj.getAttribute('id');" + "var eleName = buttonId.substring(0,3) + 'File';" + "resourceName = document.getElementsByName(eleName)[0].value;" + "var url = '/SharingSite/DownFileServlet?fileName=' + resourceName;" + "window.location.href=url;" + "}" + "</script>");
out.println("<h1>文件共享網站</h1>"); out.println("mp3資源:<input type='text' name='mp3File' /> <input type='submit' value ='點擊下載' id='mp3Down' onclick='fileDown(this)' /><br/>"); out.println("avi資源:<input type='text' name='aviFile' /> <input type='submit' value ='點擊下載' id='aviDown' onclick='fileDown(this)' /><br/>"); out.println("jpg資源:<input type='text' name='jpgFile' /> <input type='submit' value ='點擊下載' id='jpgDown' onclick='fileDown(this)' /><br/>"); out.println("txt資源:<input type='text' name='txtFile' /> <input type='submit' value ='點擊下載' id='txtDown' onclick='fileDown(this)' /><br/>"); }
/**
- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); }
}</pre>
2、然后創建一個控制器,來判斷是否盜鏈,以及處理文件下載邏輯:
package com.hyman.controller;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
/**
Servlet implementation class DownFileServlet */ public class DownFileServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/**
@see HttpServlet#HttpServlet() */ public DownFileServlet() { super(); // TODO Auto-generated constructor stub }
/**
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html; charset=utf-8"); String referer = request.getHeader("Referer"); if (referer == null || !referer.startsWith("http://localhost:8080/SharingSite/")) {
response.sendRedirect("/SharingSite/AntiPirateLink");
} else {
String fileName = request.getParameter("fileName"); response.setHeader("Content-Disposition", "attachment; filename="+fileName); String path = this.getServletContext().getRealPath("/resources/"+fileName); FileInputStream fis = null; OutputStream os = null; try { fis = new FileInputStream(new File(path)); byte buff[] = new byte[1024]; int len = 0; os = response.getOutputStream(); while ((len = fis.read(buff)) > 0) { os.write(buff, 0, len); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } finally { if (os != null) os.close(); if (fis != null) fis.close(); }
}
}
/**
- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); }
}</pre>
3、創建一個AntiPirateLink返回盜鏈提醒界面,并在10秒后自動刷新跳轉到SharedFilesServlet
package com.hyman.view;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;
/**
Servlet implementation class AntiPirateLink */ public class AntiPirateLink extends HttpServlet { private static final long serialVersionUID = 1L;
/**
@see HttpServlet#HttpServlet() */ public AntiPirateLink() { super(); // TODO Auto-generated constructor stub }
/**
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<script type='text/javascript' language='javascript'>"
+ "var i = 10;" + "function showTime(){" + "if(i > 0) {document.getElementById('time').innerHTML = '請不要盜鏈下載... ' + i +' 秒后自動跳轉到下載首頁...';" + "i--;}" + "}" + "setInterval('showTime()',1000);" + "</script>");
out.println("<span id='time'></span>"); response.setHeader("Refresh", "10; url=/SharingSite/SharedFilesServlet"); }
/**
- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); }
}</pre>
【分析】文件下載部分實現步驟:
【分析】文件下載部分實現步驟:1、response.setHeader("Content-Disposition", "attachment; filename="+fileName);在http回復消息頭中的Content-Disposition中指明下文件的文件名;
2、調用this.getServletContext().getRealPath("/resources/"+fileName);函數獲取到文件的全路徑;
3、使用文件流FileInputStream將文件讀入到服務器內存,重要要用到緩存處理,然后再調用response的getOutputStream()方法獲得向客戶端寫文件的輸出文件流;
來自: http://www.cnblogs.com/page-of-Hyman/p/4321523.html