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

前端技术 2023/09/09 JSP

复制代码 代码如下:

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;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;


/**
 * 文件下载类。为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件),在响应头里加入强制下载的MIME类型。
 */
public class DownloadFile extends HttpServlet {
 private static final Log log = LogFactory.getLog(DownloadFile.class);

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
  long timeStart = 0;
  if(log.isDebugEnabled()){
   timeStart=System.currentTimeMillis();
  }
  response.setContentType(\"application/x-download charset=UTF-8\");
  java.io.FileInputStream fis = null;
  String filepath = request.getRealPath(\"\");
  javax.servlet.ServletOutputStream sos = null;
  // System.out.println(\"DownloadFile filename:\" + filename);
  try {
   if(request.getParameter(\"filename\")==null
     ||request.getParameter(\"showName\")==null){
    return;
   }
   String filename = request.getParameter(\"filename\");
   String showName = request.getParameter(\"showName\");
   request.setCharacterEncoding(\"UTF-8\");
   response.setCharacterEncoding(\"UTF-8\");
   java.io.File file = new java.io.File(filepath + filename);
   if (!file.exists()) {
    log.error(file.getAbsolutePath() + \" 文件不存在!\");
    return;
   }
   // 读取文件流
   fis = new java.io.FileInputStream(file);
   // 设置下载保存的文件名
   sos = response.getOutputStream();
   showName += filename.substring(filename.lastIndexOf(\".\"));
   String contentDisposition = \"\", browser = getBrowser(request);
   if (\"IE\".equals(browser)) {
    contentDisposition = \"attachment; filename=\" + URLEncoder.encode(showName, \"UTF-8\").replace(\"+\", \"%20\");
   } else if (\"CH\".equals(browser)) {
    contentDisposition = \"attachment; filename=\" + MimeUtility.encodeText(showName, \"UTF8\", \"B\");
   } else if (\"SF\".equals(browser)) {
    contentDisposition = \"attachment; filename=\" + new String(showName.getBytes(\"UTF-8\"), \"ISO8859-1\");
   } else {
    contentDisposition = \"attachment; filename*=UTF-8\'\'\" + URLEncoder.encode(showName, \"UTF-8\").replace(\"+\", \"%20\");
   }
   response.setHeader(\"Content-Disposition\", contentDisposition);
   int byteCount = 0;
   if (fis != null) {
    byte[] buff = new byte[1024];
    int bytesRead;
    while(-1 != (bytesRead = fis.read(buff, 0, buff.length))) {
     sos.write(buff, 0, bytesRead);
     sos.flush();
     byteCount += bytesRead;
    }
   }
   sos.flush();
   if(log.isDebugEnabled()){
    log.debug(\"文件下载完成,文件大小:\"+ byteCount +\",总共用时:\"+ (new Date().getTime() - timeStart) +\"毫秒。\");
   }
  } catch(IOException ioe) {
   ioe.printStackTrace();
  } finally {
   try {
    if(fis!=null){
     fis.close();
    }
   } catch (IOException e) {
   } finally {
    try {
     if(sos!=null){
      sos.close();
     }
    } catch (IOException e) {
    }
   }
  }
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType(\"text/html\");
  PrintWriter out = response.getWriter();
  out.println(\"<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\" \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\");
  out.println(\"<html>\");
  out.println(\" <head>\");
  out.println(\"   <title>文件下载</title>\");
  out.println(\"   <meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />\");
  out.println(\" </head>\");
  out.println(\" <body>\");
  out.print(\" This is \");
  out.print(this.getClass().getName());
  out.println(\", using the POST method\");
  out.println(\" </body>\");
  out.println(\"</html>\");
  out.flush();
  out.close();
 }

 private String getBrowser(HttpServletRequest request) {
  String userAgent = request.getHeader(\"USER-AGENT\").toLowerCase();
  if (userAgent != null) {
   if (userAgent.indexOf(\"msie\") >= 0) {
    return \"IE\";
   } else if (userAgent.indexOf(\"mozilla\") >= 0) {
    return \"FF\";
   } else if (userAgent.indexOf(\"applewebkit\") >= 0) {
    return \"CH\";
   } else if (userAgent.indexOf(\"safari\") >= 0) {
    return \"SF\";
   } else if (userAgent.indexOf(\"opera\") >= 0) {
    return \"OP\";
   }
  }
  return null;
 }
}

本文地址:https://www.stayed.cn/item/24188

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。