jsp文件下载二种解决方法

 代码如下 复制代码

<object id="objCertEnrollClassFactory" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"></object>
        <script language="javascript">
          function InstallCert(){
                document.write("<br>Installing certificate...");       
                try {           
                    // Variables           
                    var objEnroll = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509Enrollment")           
                    sPKCS7="-----BEGIN CERTIFICATE-----    MIIDZzCCAk+...   -----END CERTIFICATE-----";
                    objEnroll.Initialize(1); // ContextUser           
                    objEnroll.InstallResponse(0, sPKCS7, 6, "");
                    // AllowNone = 0, XCN_CRYPT_STRING_BASE64_ANY = 6       
                }catch (err)
                {           
                    document.write("<br>" + err.description);           
                    return false;      
                 }   
                return true;
            }   
        InstallCert();

 

上面的实例只能在window下载使用

 代码如下 复制代码

<%--
直接在JSP页面中进行文件下载的代码(改 Servlet 或者
JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向
out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据
库中读取也可以的.
需传三个参数 newname,name,path
--%>
<%@ page contentType=" text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.io.*,java.util.*,java.text.*"%>
<%!//If returns true, then should return a 304 (HTTP_NOT_MODIFIED)
 public static boolean checkFor304(HttpServletRequest req, File file) {
  //   We'll do some handling for CONDITIONAL GET (and return a 304)
  //   If the client has set the following headers, do not try for a 304.
  //     pragma: no-cache
  //     cache-control: no-cache
  if ("no-cache".equalsIgnoreCase(req.getHeader("Pragma"))
    || "no-cache".equalsIgnoreCase(req.getHeader("cache-control"))) {
   //  Wants specifically a fresh copy
  } else {
   //   HTTP 1.1 ETags go first
   String thisTag = Long.toString(file.lastModified());
   String eTag = req.getHeader("If-None-Match");
   if (eTag != null) {
    if (eTag.equals(thisTag)) {
     return true;
    }
   }
   //   Next, try if-modified-since
   DateFormat rfcDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
   Date lastModified = new Date(file.lastModified());
   try {
    long ifModifiedSince = req.getDateHeader("If-Modified-Since");
    // log.info("ifModifiedSince:"+ifModifiedSince);
    if (ifModifiedSince != -1) {
     long lastModifiedTime = lastModified.getTime();
     // log.info("lastModifiedTime:" + lastModifiedTime);
     if (lastModifiedTime <= ifModifiedSince) {
      return true;
     }
    } else {
     try {
      String s = req.getHeader(" If-Modified-Since ");
      if (s != null) {
       Date ifModifiedSinceDate = rfcDateFormat.parse(s);
       // log.info("ifModifiedSinceDate:" + ifModifiedSinceDate);
       if (lastModified.before(ifModifiedSinceDate)) {
        return true;
       }
      }
     } catch (ParseException e) {
      // log.warn(e.getLocalizedMessage(), e);
     }
    }
   } catch (IllegalArgumentException e) {
    //  Illegal date/time header format.
    //  We fail quietly, and return false.
    //  FIXME: Should really move to ETags.
   }
  }
  return false;
 }%>
<%
   String newname=request.getParameter("upfile_newname");
   String name=request.getParameter("upfile_name");
   String path=request.getParameter("upfile_path");
 //  String filePath = "c:/文档.doc";
 //  如果是 WEB APP 下的相对路径文件, 请使用下列代码:
 if(path.charAt(0)=='/') path=path.substring(1);
 String filePath = application.getRealPath(path+"/"+newname);
 boolean isInline = false; //  是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,
 //  那么文件将被打开, 否则会提示下载)
 //  清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去
 //  如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错
 //  java.lang.IllegalStateException: getOutputStream() has already been called for
 //  this response,
 out.clear();
 //  {{{ BEA Weblogic 必读
 //  修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题
 //  关于文件下载时采用文件流输出的方式处理:
 //  加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
 //  因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
 //  而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
 //  就会发生:getOutputStream() has already been called for this response的错误
 //  详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
 //  而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
 // 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。
 //  同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去
 response.reset();
 //  }}}
 try {
  java.io.File f = new java.io.File(filePath);
  if (f.exists() && f.canRead()) {
   //  我们要检查客户端的缓存中是否已经有了此文件的最新版本, 这时候就告诉
   //  客户端无需重新下载了, 当然如果不想检查也没有关系
   if (checkFor304(request, f)) {
    //  客户端已经有了最新版本, 返回 304
    response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
    return;
   }
   //  从服务器的配置来读取文件的 contentType 并设置此contentType, 不推荐设置为
   //  application/x-download, 因为有时候我们的客户可能会希望在浏览器里直接打开,
   //  如 Excel 报表, 而且 application/x-download 也不是一个标准的 mime type,
   //  似乎 FireFox 就不认识这种格式的 mime type
   String mimetype = null;
   mimetype = application.getMimeType(filePath);
   if (mimetype == null) {
    mimetype = "application/octet-stream;charset=iso8859-1";
   }
   response.setContentType(mimetype);
   //  IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件!
   String ua = request.getHeader("User-Agent"); //  获取终端类型
   if (ua == null)
    ua = "User-Agent:Mozilla/4.0(compatible; MSIE 6.0;)";
   boolean isIE = ua.toLowerCase().indexOf("msie") != -1; //  是否为 IE
   if (isIE && !isInline) {
    mimetype = "application/x-msdownload";
   }
   //  下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名
   //  转换为 ISO8859-1 编码
   String downFileName = new String(f.getName().getBytes(),"iso8859-1");
   String inlineType = isInline ? "inline" : "attachment"; //  是否内联附件
   //  or using this, but this header might not supported by FireFox
   // response.setContentType("application/x-download");
   response.setHeader("Content-Disposition", inlineType+";filename=""+name+""");
   response.setContentLength((int) f.length()); //  设置下载内容大小
   byte[] buffer = new byte[4096]; //  缓冲区
   BufferedOutputStream output = null;
   BufferedInputStream input = null;
   try {
    output = new BufferedOutputStream(response.getOutputStream());
    input = new BufferedInputStream(new FileInputStream(f));
    int n = (-1);
    while ((n = input.read(buffer, 0, 4096)) > -1) {
     output.write(buffer, 0, n);
    }
    <SPAN style="COLOR: #ff00ff">response.flushBuffer();//明白了,如何下载内容</SPAN>
   } catch (Exception e) {
   } //  用户可能取消了下载
   finally {
    if (input != null)
     input.close();
    if (output != null)
     output.close();
   }
  }
  return;
 } catch (Exception ex) {
  ex.printStackTrace();
 }
 //  如果下载失败了就告诉用户此文件不存在
 response.sendError(404);
%>

时间: 2025-01-02 19:07:56

jsp文件下载二种解决方法的相关文章

jquery ajax jsp 返回值乱码二向解决方法

jquery ajax 网页特效p/jsp.html target=_blank >jsp教程 返回值乱码二向解决方法在以前开发ajax时经常会碰到乱码,今天我们用jquery ajax+jsp时,又出来乱码了,经常测试找到了二种处理jquery ajax乱码问题,下面看看. <script> $().ready(function(){ var url="/www.111cn.net/ajaxgetnewsclassfather.do"; var pars="

ASP+中文显示之两种解决方法

ASP+中文显示之两种解决方法 作者刚开始写ASP+程序时候碰到的第一个比较大的问题就是中文显示问题,运行后发现ASP+从数据库中读出来的中文全部变成了?????,有点类似jsp中的这个频率出现最高的中文显示问题了,查了资料发现有种方法可以轻松解决中文问题. 方法一: 在翻阅了微软NGWS文档后发现在文档的常见问题部分有提到要添加一个config.web文件到 web目录下,试了一下,中文显示果然OK了. 方法如下: 建立一个文件config.web,内容如下,放在WEB目录下 <configu

解决中文乱码的几种解决方法(推荐)_JSP编程

首先说明我的特殊情况: 1. 前台jsp中,我使用的是 form post 请求,设置了 enctype="multipart/form-data" ,页面编码格式都是utf-8 2. 后台中,我使用的是commons-fileUpload组件,ServletFileUpload 解析form表单和文件, 3. 设置 request.setCharacterEncoding("UTF-8"); 4. 设置了ServletFileUpload .setHeaderEn

win7启动修复无法自动修复此计算机3种解决方法

使用Windows 7操作系统开机提示自动修复,无法正常进入操作系统.经过分析,部分系统修复报错文件为:X:Windowssystem32driversspoon.sys 如下图: 计算机3种解决方法-win7修复计算机启动项"> 解决方法: 方法一: 1. 开机连续敲击键盘"F8 "按键,进入"系统高级选项菜单 ",选择"最后一次正确配置 "如下图: 2. 如可以常进入操作系统,请指导用户删除如下路径的spoon.sys 文件:

win8.1系统升级失败的两种解决方法

win8.1系统升级失败的两种解决方法   方法一: 1. 杀毒软件(建议关闭或者先卸载). 2. 有问题的驱动. 3. 某些使用不兼容wind8.1的外部设备. 解决方法: 1. 首先请确认您的机型是否支持升级到Win8.1 2. 建议您把所有非联想预装的外部设备暂时移除,如鼠标,键盘,打印机,摄像头等等. 3. 建议您备份重要的个人文件,使用一键恢复功能把电脑恢复到出厂状态,操作方法请参考. 4. 卸载可能影响更新的软件和驱动程序,如杀毒软件,电源管理,显卡驱动等等. 5. 安装所有Wind

ASP.NET防止页面刷新的两种解决方法

 本篇文章主要是对ASP.NET防止页面刷新的两种解决方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法有二,总结如下:    第一方法:  直接在CS代码里敲:  Response.Buffer = true;  Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);  Response.Expires = 0;  Response.CacheControl = "no-cache";    当有人想按

桌面图标有蓝底的三种解决方法

  桌面图标有蓝底的三种解决方法.          方法一.在桌面右击,选择"排列图标",确保"在桌面上锁定web项目"没有勾选   方法二. 1.右击"我的电脑",选择属性 2.切换到"高级"选项卡,点击性能下的"设置"按钮,如下图所示 3.切换到"视觉效果"选项卡,下拉右边的滚动条,勾选"在桌面上为图标标签使用阴影",点击"确定"按钮保存退出

Win7远程操作时提示“远程桌面服务当前正忙”两种解决方法

  Win7远程操作时提示"远程桌面服务当前正忙"两种解决方法           Win7系统远程桌面操作能够实现远程操控电脑,通过远程连接来进行一些控制,可是有些用户在进行远程连接的时候,输入账号密码无法进入,重新进入就会提示"由于远程桌面服务当前正忙,因此无法完成您尝试执行的任务",遇到这个问题该如何解决呢?下面小编给大家两种解决方法. 解决方法一 看一下你电脑任务管理器此项任务是否还在,如果在的话关掉就行了,很多时候是电脑没有反应过来造成的. 解决办法二 原

win7打开exe文件提示“无法打开exe可执行文件”两种解决方法

  win7打开exe文件提示"无法打开exe可执行文件"两种解决方法          1.打开"计算机"或任意文件夹,点击"组织"-"文件夹和搜索选项"; 2.在"文件夹选项"框中点击"查看"选卡,然后在下面"高级设置"下框中将"隐藏已知文件类型的扩展名"前面的 勾去掉,点击应用并确定; 3.在桌面空白处鼠标右击选择"新建-文本文档&