Servlet实现代理文件下载功能

用户向代理服务器发送请求,代理服务器从后端服务器上获取文件,并返回给用户
web.xml:

<servlet>
 <servlet-name>BigFile</servlet-name>
 <servlet-class>cn.ac.dsp.servlet.BigFile</servlet-class>
</servlet>
 <servlet-mapping>
 <servlet-name>BigFile</servlet-name>
 <url-pattern>*.ts</url-pattern>
</servlet-mapping>

servlet:

package cn.ac.dsp.servlet; 

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter; 

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.log4j.Logger; 

import cn.ac.dsp.common.Constant;
import cn.ac.dsp.common.SystemParameters; 

/**
 * 给静态大文件提供服务的servlet
 */
public class BigFile extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private static final Logger log = Logger.getLogger(BigFile.class); 

 /**
  * @see HttpServlet#HttpServlet()
  */
 public BigFile() {
  super();
  // TODO Auto-generated constructor stub
 } 

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  log.info("request for bigfile");
  long startTime = System.nanoTime();
  String requestUrl = request.getRequestURI();
  //请求的文件名
  String filename = requestUrl.substring(requestUrl.lastIndexOf("/"));
  HttpClient httpClient = new DefaultHttpClient();
  httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, Constant.HttpConnTimeOut);
  httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, Constant.SoConnTimeOut);
  httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
  //后端服务器的IP
  String serverIP = "192.168.101.190";
  //后端服务器的文件地址
  StringBuilder backUrl = new StringBuilder();
  backUrl.append("http://");
  backUrl.append(serverIP);
  backUrl.append("/LBA/bigfile/");
  backUrl.append(filename);
  HttpGet httpGet = new HttpGet(backUrl.toString());
  httpGet.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
  log.info("distribute bigfile to " + backUrl.toString());
  HttpResponse backResponse;
  try {
   backResponse = httpClient.execute(httpGet);
//   log.info(backResponse.getParams().getParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET));
   HttpEntity httpEntity = backResponse.getEntity();
   InputStream in = httpEntity.getContent();
//   BufferedReader br = new BufferedReader(new InputStreamReader(httpEntity.getContent(), "UTF-8"));
   byte[] buf = new byte[4096];
   int readLength;
   response.setCharacterEncoding("UTF-8");
   ServletOutputStream out = response.getOutputStream();
   while((readLength = in.read(buf)) != -1){
    out.write(buf, 0, readLength);
   }
   in.close();
   out.flush();
   out.close();
  } catch (ClientProtocolException e) {
   StringWriter sw = new StringWriter();
   e.printStackTrace(new PrintWriter(sw));
   log.error("ClientProtocolException when redirect bigfile. " + sw.toString());
  } catch (IOException e) {
   StringWriter sw = new StringWriter();
   e.printStackTrace(new PrintWriter(sw));
   log.error("IOException when redirect bigfile. " + sw.toString());
  }
  long endTime = System.nanoTime();
  System.out.println("Response time: " + (endTime-startTime) + " ns");
 } 

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 } 

}

参考:一个文件下载的Servlet

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 访问JSP文件或者Servlet文件时提示下载的解决方法

    如下图所示:同样的程序有的浏览器出错,有的浏览器不出错.错误的原因是设置MIME类型的代码有误. 如果是JSP文件,查看文件头: 复制代码 代码如下: <%@ page contentType="text/html;charset=gb2312"%> 如果是Servlet文件,查看: 复制代码 代码如下: response.setContentType("text/html;charset=gb2312");

  • servlet实现文件下载的实用类分享

    复制代码 代码如下: package com; import java.io.IOException;import java.io.PrintWriter;import java.net.URLEncoder;import java.util.Date; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;i

  • 简单实现Servlet文件下载功能

    Web容器为Servlet生成并且传递的HttpServletResponse对象不仅可以返回HTML文本,而且可以返回任何主流的其他文件格式,例如,.doc..pdf..jar..avi等内容格式的文件.这些类型内容在HTTP协议中主要是体现在HTTP响应消息中的消息头部的content-type字段以及响应有效负载中. content-type是想浏览器指明有效负载区里的内容是某某类型的,例如:.jar类型的内容. 而有效负载中的内容就是目标文件的字节集合,也就是二进制内容格式,而不是具体的

  • servlet实现文件下载的步骤及说明详解

    servlet实现文件下载所需步骤及说明,供大家参考,具体内容如下 参考文章:Servlet实现文件下载功能 1.原理介绍: Web容器为Servlet生成并且传递的HttpServletResponse对象不仅可以返回HTML文本,而且可以返回任何主流的其他文件格式,例如,.doc..pdf..jar..avi等内容格式的文件.这些类型内容在HTTP协议中主要是体现在HTTP响应消息中的消息头部的content-type字段以及响应有效负载中. content-type是向浏览器指明有效负载区

  • jsp实现Servlet文件下载的方法

    本文实例讲述了jsp实现Servlet文件下载的方法.分享给大家供大家参考.具体如下: package com; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j

  • servlet监听实现统计在线人数功能 附源码下载

    本文实例为大家分享了servlet统计在线人数的具体代码,供大家参考,具体内容如下 ServletContext事件监听器---->针对applicationScope ServletContextListener(*) 对整个Web应用的装载和卸载进行监听.  ServletContextAttributeListener 对ServletContext中的信息存放.删除和替换进行监听. ServletContext就是Servlet上下文监听,在web中表示的是对启动服务和销毁服务进行监听,

  • Java Servlet简单实例分享(文件上传下载demo)

    项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

  • servlet实现文件上传、预览、下载、删除功能

    servlet实现文件上传,预览,下载和删除,供大家参考,具体内容如下 一.准备工作: 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转成JSON对象需要jar包:commons-beanutils-1.8.3.jar.commons-collections-3.2.1.jar.commons-lang-2.6.jar.commons-logging-1.1.

  • java基于servlet编写上传下载功能 类似文件服务器

    本人闲来无事,写了个servlet,实现上传下载功能.启动服务后,可以在一个局域网内当一个小小的文件服务器. 一.准备工作 下载两个jar包: commons-fileupload-1.3.1.jar commons-io-2.2.jar 二.创建一个web工程 我的工程名叫:z-upload 三.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht

  • servlet简单实现文件下载的方法

    本文实例讲述了servlet简单实现文件下载的方法.分享给大家供大家参考,具体如下: public static void download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径. File file = new File(path); // 取得文件名. String filename = file.getName(); // 取得文件的后缀名. String ext = filename.s

随机推荐