Servlet实现代理文件下载

5 篇文章 0 订阅
3 篇文章 0 订阅

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值