jsp_下载文件_转

jsp java 下载文件

文章分类:Java编程

Html代码
  1. < %@ page  language = "java"   pageEncoding = "gb2312"   
  2.     import = "com.myerp.jichu.publicclass.*"   import = "java.sql.*"   
  3.     contentType = "text/html;charset=GB2312" % >   
  4. < %@ page  
  5.     import = "com.myerp.jichu.caozuo.*,java.io.*, java.util.*, java.text.*" % >   
  6. < jsp:directive.page   import = "java.util.Date"   />   
  7.   
  8.   
  9.   
  10. < %  
  11. //String path  =  request .getContextPath();  
  12. //String basePath  =  request .getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  13. String zygx_id = request .getParameter("zygxid");  
  14. String zygxurl = request .getParameter("zygxurl");  
  15. String zygxYwjm = request .getParameter("zygxywjm");  
  16.   
  17. zygxurl zygxurl  = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名  
  18.   
  19. Str str = new  Str();  
  20. int zygxid = str .parseInt(zygx_id);  
  21.   
  22. %>   
  23.   
  24. < %--      
  25. 直接在JSP页面中进行文件下载的代码(改 Servlet 或者     
  26. JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向     
  27. out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据     
  28. 库中读取也可以的.     
  29. 需传三个参数 newname,name,path     
  30. --%>      
  31.     
  32. < %!//If returns true, then should return a 304 (HTTP_NOT_MODIFIED)     
  33.     public static boolean checkFor304(HttpServletRequest req, File file) {     
  34.         //   We'll do some handling for CONDITIONAL GET (and return a 304)     
  35.         //   If the client has set the following headers, do not try for a 304.     
  36.         //     pragma: no-cache     
  37.         //     cache-control: no-cache     
  38.         if ("no-cache".equalsIgnoreCase(req.getHeader("Pragma"))     
  39.                 || "no-cache".equalsIgnoreCase(req.getHeader("cache-control"))) {     
  40.             //  Wants specifically a fresh copy      
  41.         } else {     
  42.             //   HTTP 1.1 ETags go first     
  43.             String thisTag  =  Long .toString(file.lastModified());     
  44.             String eTag  =  req .getHeader("If-None-Match");     
  45.             if (eTag != null) {     
  46.                 if (eTag.equals(thisTag)) {     
  47.                     return true;     
  48.                 }     
  49.             }     
  50.             //   Next, try if-modified-since     
  51.             DateFormat rfcDateFormat  =  new  SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");     
  52.             Date lastModified  =  new  Date(file.lastModified());     
  53.             try {     
  54.                 long ifModifiedSince  =  req .getDateHeader("If-Modified-Since");     
  55.                 // log.info("ifModifiedSince:"+ifModifiedSince);      
  56.                 if (ifModifiedSince != -1) {     
  57.                     long lastModified lastModifiedTime  = lastModified.getTime();     
  58.                     // log.info("lastModifiedTime:" + lastModifiedTime);      
  59.                     if (lastModifiedTime < = ifModifiedSince) {     
  60.                         return true;     
  61.                     }     
  62.                 } else {     
  63.                     try {     
  64.                         String s  =  req .getHeader(" If-Modified-Since ");     
  65.                         if (s != null) {     
  66.                             Date ifModifiedSinceDate  =  rfcDateFormat .parse(s);     
  67.                             // log.info("ifModifiedSinceDate:" + ifModifiedSinceDate);      
  68.                             if (lastModified.before(ifModifiedSinceDate)) {     
  69.                                 return true;     
  70.                             }     
  71.                         }     
  72.                     } catch (ParseException e) {     
  73.                         // log.warn(e.getLocalizedMessage(), e);      
  74.                     }     
  75.                 }     
  76.             } catch (IllegalArgumentException e) {     
  77.                 //  Illegal date/time header format.     
  78.                 //  We fail quietly, and return false.     
  79.                 //  FIXME: Should really move to ETags.      
  80.             }     
  81.         }     
  82.         return false;     
  83.     }%>      
  84. < %     
  85.   
  86.     String filePath  =  application .getRealPath("zygxq/"+zygxurl);//zygxurl为保存的文件名  
  87.       
  88.     boolean isInline  =  false ; //  是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,     
  89.     //  那么文件将被打开, 否则会提示下载)     
  90.     //  清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去     
  91.     //  如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错     
  92.     //  java.lang.IllegalStateException: getOutputStream() has already been called for     
  93.     //  this response,      
  94.     out.clear();     
  95.     //  {{{ BEA Weblogic 必读     
  96.     //  修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题     
  97.     //  关于文件下载时采用文件流输出的方式处理:     
  98.     //  加上response.reset(),并且所有的%> 后面不要换行,包括最后一个;     
  99.     //  因为Application Server在处理编译jsp时对于%> < %之间的内容一般是原样输出,而且默认是PrintWriter,     
  100.     //  而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,     
  101.     //  就会发生:getOutputStream() has already been called for this response的错误     
  102.     //  详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270    
  103.     //  而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件     
  104.     // 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。     
  105.     //  同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去      
  106.     response.reset();     
  107.     //  }}}      
  108.     try {     
  109.         java.io.File f  =  new  java.io.File(filePath);     
  110.         if (f.exists() && f.canRead()) {     
  111.             //  我们要检查客户端的缓存中是否已经有了此文件的最新版本, 这时候就告诉     
  112.             //  客户端无需重新下载了, 当然如果不想检查也没有关系      
  113.             if (checkFor304(request, f)) {     
  114.                 //  客户端已经有了最新版本, 返回 304      
  115.                 response.sendError(HttpServletResponse.SC_NOT_MODIFIED);     
  116.                 return;     
  117.             }     
  118.             //  从服务器的配置来读取文件的 contentType 并设置此contentType, 不推荐设置为     
  119.             //  application/x-download, 因为有时候我们的客户可能会希望在浏览器里直接打开,     
  120.             //  如 Excel 报表, 而且 application/x-download 也不是一个标准的 mime type,     
  121.             //  似乎 FireFox 就不认识这种格式的 mime type      
  122.             String mimetype  =  null ;     
  123.             mimetype  =  application .getMimeType(filePath);     
  124.             if (mimetype  == null) {     
  125.                 mimetype  =  "application/octet-stream;charset=gb2312" ;     
  126.             }     
  127.             response.setContentType(mimetype);     
  128.             //  IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件!      
  129.             String ua  =  request .getHeader("User-Agent"); //  获取终端类型      
  130.             if (ua  == null)     
  131.                 ua  =  "User-Agent:Mozilla/4.0(compatible; MSIE 6.0;)" ;     
  132.             boolean isIE  =  ua .toLowerCase().indexOf("msie") != -1; //  是否为 IE      
  133.             if (isIE && !isInline) {     
  134.                 mimetype  =  "application/x-msdownload" ;     
  135.             }     
  136.             //  下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名     
  137.             //  转换为 gb2312 编码      
  138.             String downFileName  =  new  String(f.getName().getBytes(),"gb2312");     
  139.             String inlineType  =  isInline  ? "inline" : "attachment"; //  是否内联附件     
  140.             //  or using this, but this header might not supported by FireFox     
  141.             // response.setContentType("application/x-download");      
  142.             response.setHeader("Content-Disposition", inlineType+";filename =\""+zygxYwjm+"\"");//zygxYwjm为客户看到的下载文件名  
  143.             response.setContentLength((int) f.length()); //  设置下载内容大小      
  144.             byte[] buffer  =  new  byte[4096]; //  缓冲区      
  145.             BufferedOutputStream output  =  null ;     
  146.             BufferedInputStream input  =  null ;     
  147.             try {     
  148.                 output  =  new  BufferedOutputStream(response.getOutputStream());     
  149.                 input  =  new  BufferedInputStream(new FileInputStream(f));     
  150.                 int n  = (-1);     
  151.                 while ((n  =  input .read(buffer, 0, 4096))  >  -1) {     
  152.                     output.write(buffer, 0, n);     
  153.                 }     
  154.                 response.flushBuffer();     
  155.             } catch (Exception e) {     
  156.             } //  用户可能取消了下载      
  157.             finally {     
  158.                 if (input != null)     
  159.                     input.close();     
  160.                 if (output != null)     
  161.                     output.close();     
  162.             }     
  163.         }     
  164.         return;     
  165.     } catch (Exception ex) {     
  166.         ex.printStackTrace();      
  167.     }     
  168.     //  如果下载失败了就告诉用户此文件不存在      
  169.     response.sendError(404);     
  170. %>     
<%@ page language="java" pageEncoding="gb2312"
	import="com.myerp.jichu.publicclass.*" import="java.sql.*"
	contentType="text/html;charset=GB2312"%>
<%@ page
	import="com.myerp.jichu.caozuo.*,java.io.*, java.util.*, java.text.*"%>
<jsp:directive.page import="java.util.Date" />



<%
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String zygx_id=request.getParameter("zygxid");
String zygxurl=request.getParameter("zygxurl");
String zygxYwjm=request.getParameter("zygxywjm");

zygxurl = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名

Str str=new Str();
int zygxid=str.parseInt(zygx_id);

%>

<%--    
直接在JSP页面中进行文件下载的代码(改 Servlet 或者   
JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向   
out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据   
库中读取也可以的.   
需传三个参数 newname,name,path   
--%>   
  
<%!//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 filePath = application.getRealPath("zygxq/"+zygxurl);//zygxurl为保存的文件名
    
    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=gb2312";   
            }   
            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";   
            }   
            //  下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名   
            //  转换为 gb2312 编码    
            String downFileName = new String(f.getName().getBytes(),"gb2312");   
            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=\""+zygxYwjm+"\"");//zygxYwjm为客户看到的下载文件名
            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);   
                }   
                response.flushBuffer();   
            } catch (Exception e) {   
            } //  用户可能取消了下载    
            finally {   
                if (input != null)   
                    input.close();   
                if (output != null)   
                    output.close();   
            }   
        }   
        return;   
    } catch (Exception ex) {   
        ex.printStackTrace();    
    }   
    //  如果下载失败了就告诉用户此文件不存在    
    response.sendError(404);   
%>  


黑色头发:http://heisetoufa.iteye.com/

你可能感兴趣的:(jsp,cache,weblogic,IE,Excel)