热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

jsp实现Servlet文件下载的方法

这篇文章主要介绍了jsp实现Servlet文件下载的方法,涉及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 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("");
    out.println("");
    out.println(" ");
    out.println("  ");
    out.println("  ");
    out.println(" ");
    out.println(" ");
    out.print(" This is ");
    out.print(this.getClass().getName());
    out.println(", using the POST method");
    out.println(" ");
    out.println("");
    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;
  }
}

希望本文所述对大家的JSP程序设计有所帮助。


推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
author-avatar
天秤aaaaaaa_150
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有