• Servlet实现web站点文件下载功能示例


      前段时间事情比较多,导致二月份没有记录自己的学习情况。最近接触了servlet,参考韩老师的教程自己写了一个web站点文件下载的小项目,该项目中还加入了简单的反盗链技术。

      1、首先创建一个SharedFilesServlet用于返回一个文件分享界面

     1 package com.hyman.view;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * Servlet implementation class SharedFilesServlet
    13  */
    14 public class SharedFilesServlet extends HttpServlet {
    15     private static final long serialVersionUID = 1L;
    16        
    17     /**
    18      * @see HttpServlet#HttpServlet()
    19      */
    20     public SharedFilesServlet() {
    21         super();
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     /**
    26      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    27      */
    28     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    29         // TODO Auto-generated method stub
    30         response.setContentType("text/html; charset=utf-8"); 
    31         PrintWriter out = response.getWriter();
    32         out.println("<script type='text/javascript' language='javascript'>"
    33                 + "function fileDown(obj){"
    34                 + "var resourceName = '';"
    35                 + "var buttonId = obj.getAttribute('id');"
    36                 + "var eleName = buttonId.substring(0,3) + 'File';"            
    37                 + "resourceName = document.getElementsByName(eleName)[0].value;"
    38                 + "var url = '/SharingSite/DownFileServlet?fileName=' + resourceName;"
    39                 + "window.location.href=url;"
    40                 + "}"
    41                 + "</script>");
    42         out.println("<h1>文件共享网站</h1>");
    43         out.println("mp3资源:<input type='text' name='mp3File' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='点击下载' id='mp3Down' onclick='fileDown(this)' /><br/>");
    44         out.println("avi资源:<input type='text' name='aviFile' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='点击下载' id='aviDown' onclick='fileDown(this)' /><br/>");
    45         out.println("jpg资源:<input type='text' name='jpgFile' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='点击下载' id='jpgDown' onclick='fileDown(this)' /><br/>");
    46         out.println("txt资源:<input type='text' name='txtFile' />&nbsp;&nbsp;&nbsp;&nbsp;<input type='submit' value ='点击下载' id='txtDown' onclick='fileDown(this)' /><br/>");
    47     }
    48 
    49     /**
    50      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    51      */
    52     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    53         // TODO Auto-generated method stub
    54         this.doGet(request, response);
    55     }
    56 
    57 }

      2、然后创建一个控制器,来判断是否盗链,以及处理文件下载逻辑:

     1 package com.hyman.controller;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 import java.io.OutputStream;
     7 
     8 import javax.servlet.ServletException;
     9 import javax.servlet.http.HttpServlet;
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 
    13 /**
    14  * Servlet implementation class DownFileServlet
    15  */
    16 public class DownFileServlet extends HttpServlet {
    17     private static final long serialVersionUID = 1L;
    18        
    19     /**
    20      * @see HttpServlet#HttpServlet()
    21      */
    22     public DownFileServlet() {
    23         super();
    24         // TODO Auto-generated constructor stub
    25     }
    26 
    27     /**
    28      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    29      */
    30     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    31         // TODO Auto-generated method stub
    32         response.setContentType("text/html; charset=utf-8");
    33         String referer = request.getHeader("Referer");
    34         if (referer == null || !referer.startsWith("http://localhost:8080/SharingSite/")) {
    35             response.sendRedirect("/SharingSite/AntiPirateLink");
    36         } else {
    37             String fileName = request.getParameter("fileName");
    38             response.setHeader("Content-Disposition", "attachment; filename="+fileName);
    39             String path = this.getServletContext().getRealPath("/resources/"+fileName);
    40             FileInputStream fis = null;
    41             OutputStream os = null;
    42             try {
    43                 fis = new FileInputStream(new File(path));
    44                 byte buff[] = new byte[1024];
    45                 int len = 0;
    46                 os = response.getOutputStream();
    47                 while ((len = fis.read(buff)) > 0) {
    48                     os.write(buff, 0, len);
    49                 }
    50             } catch (Exception e) {
    51                 e.printStackTrace();
    52                 throw new RuntimeException();
    53             } finally {
    54                 if (os != null) os.close();
    55                 if (fis != null) fis.close();
    56             }
    57         }
    58         
    59     }
    60 
    61     /**
    62      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    63      */
    64     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    65         // TODO Auto-generated method stub
    66         this.doGet(request, response);
    67     }
    68 
    69 }

      3、创建一个AntiPirateLink返回盗链提醒界面,并在10秒后自动刷新跳转到SharedFilesServlet

     1 package com.hyman.view;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * Servlet implementation class AntiPirateLink
    13  */
    14 public class AntiPirateLink extends HttpServlet {
    15     private static final long serialVersionUID = 1L;
    16        
    17     /**
    18      * @see HttpServlet#HttpServlet()
    19      */
    20     public AntiPirateLink() {
    21         super();
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     /**
    26      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    27      */
    28     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    29         // TODO Auto-generated method stub
    30         response.setContentType("text/html; charset=utf-8");
    31         PrintWriter out = response.getWriter();
    32         out.println("<script type='text/javascript' language='javascript'>"
    33                 + "var i = 10;"
    34                 + "function showTime(){"
    35                 + "if(i > 0) {document.getElementById('time').innerHTML = '请不要盗链下载... ' + i +' 秒后自动跳转到下载首页...';"
    36                 + "i--;}"
    37                 + "}"
    38                 + "setInterval('showTime()',1000);"
    39                 + "</script>");
    40         out.println("<span id='time'></span>");
    41         response.setHeader("Refresh", "10; url=/SharingSite/SharedFilesServlet");
    42     }
    43 
    44     /**
    45      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    46      */
    47     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    48         // TODO Auto-generated method stub
    49         this.doGet(request, response);
    50     }
    51 
    52 }

    【分析】文件下载部分实现步骤:

    1、response.setHeader("Content-Disposition", "attachment; filename="+fileName);在http回复消息头中的Content-Disposition中指明下文件的文件名;
    2、调用this.getServletContext().getRealPath("/resources/"+fileName);函数获取到文件的全路径;
    3、使用文件流FileInputStream将文件读入到服务器内存,重要要用到缓存处理,然后再调用response的getOutputStream()方法获得向客户端写文件的输出文件流;

  • 相关阅读:
    搜索入门练习题3 全组合 题解
    搜索入门练习题1 素数环 题解
    搜索入门练习题2 全排列 题解
    二分 大纲
    凸包
    快速幂&矩阵快速幂
    最长不下降子序列的优化
    poj 3190 Stall Reservations
    poj 2431 Expedition

  • 原文地址:https://www.cnblogs.com/page-of-Hyman/p/4321523.html
Copyright © 2020-2023  润新知