Servlet實現web站點文件下載功能示例

jopen 9年前發布 | 1K 次閱讀 Java

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' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='點擊下載' id='mp3Down' onclick='fileDown(this)' /><br/>"); out.println("avi資源:<input type='text' name='aviFile' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='點擊下載' id='aviDown' onclick='fileDown(this)' /><br/>"); out.println("jpg資源:<input type='text' name='jpgFile' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='點擊下載' id='jpgDown' onclick='fileDown(this)' /><br/>"); out.println("txt資源:<input type='text' name='txtFile' />&nbsp;&nbsp;&nbsp;&nbsp;<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/&quot;)) {

       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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!