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

 servlet文件下载类,为了防止客户端浏览器直接打开目标文件,在响应头里加入强制下载的MIME类型,大家参考使用吧

 
代码如下:
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;
 }
}
 
 

时间: 2024-10-07 10:17:11

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

servlet实现文件下载的实用类分享_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;i

Struts2实现文件下载功能代码分享(文件名中文转码)_java

struts2文件下载功能实现代码如下所示: Action文件 public class DownLoadAction extends ActionSupport { /** * */ private static final long serialVersionUID = 5879762231742395104L; private String fileName;//用户请求的文件名 private String inputPath;//下载资源的路径(在struts配置文件中设置) publ

servlet的文件下载,请问服务器端有办法知道客户端是否关闭了下载窗口吗?

问题描述 客户端网页调用servlet执行文件下载(response输出流),如果下载过程中:1)用户关闭了下载窗口2)用户关闭了当前标签页(浏览器tab)3)用户关闭了浏览器窗口请问服务器端有没有办法知道这些事件呢?恳请高人指点! 解决方案 解决方案二:不能知道,不过你如果用的servlet3+tomcat7应该是可以知道

php加密解密实用类分享

 加密和解密是一项常规任务,这里介绍一个加解密类.如果你想在用户忘记密码时为他或她找回原来的密码,那么这个类是个好用的工具 用户注册的密码一般不会明文保存,总得加个密先.最简单的当然是在数据库sql语句中调用md5函数加密用户密码.这里介绍一个加解密类.如果你想在用户忘记密码时为他或她找回原来的密码,那么这个类是个好用的工具.当然,这个加解密类也可用于其他用途.  代码如下: <?php   class crypt {       private $skey;       public func

php加密解密实用类分享_php实例

用户注册的密码一般不会明文保存,总得加个密先.最简单的当然是在数据库sql语句中调用md5函数加密用户密码.这里介绍一个加解密类.如果你想在用户忘记密码时为他或她找回原来的密码,那么这个类是个好用的工具.当然,这个加解密类也可用于其他用途. 复制代码 代码如下: <?php class crypt {     private $skey;     public function __construct($key) {        $this->skey = hash("md5&qu

文件下载的Servlet

servlet|下载 //文件下载的Servlet import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*; public class downloadfile extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=GBK"; //Initialize g

Servlet下载文件文件名问题

问题描述 Servlet下载文件文件名问题 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FileDBO fileDBO = new FileDBO(); String fileID = request.getParameter("fileId"); FileInfor file = fileDBO

PHP实现文件操作类及文件下载功能的教程

本文实例讲述了PHP实现的文件操作类及文件下载功能.分享给大家供大家参考,具体如下: 文件操作类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

摘自织梦CMS的HTTP文件下载类_php实例

本文实例讲述了摘自织梦CMS的HTTP文件下载类.分享给大家供大家参考.具体如下: <?php if(!defined('DEDEINC')) exit("Request Error!"); /** * 织梦HTTP下载类 * * @version $Id: dedehttpdown.class.php 1 11:42 2010年7月6日Z tianya $ * @package DedeCMS.Libraries * @copyright Copyright (c) 2007