Servlet实现代理文件下载

来源:互联网 发布:梦里花落知多少背影 编辑:程序博客网 时间:2024/05/22 09:59

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

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");//后端服务器的IPString 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

原创粉丝点击