`
白云飞
  • 浏览: 33680 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)JSP文件下载

阅读更多
<%--    
直接在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);   
                }   
                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);   
%>  

 

分享到:
评论

相关推荐

    jsp文件的上传和下载

    另一个Servlet或JSP页面,根据用户请求生成文件下载链接。 总的来说,这个项目展示了如何在Java和JSP环境中实现文件上传和下载功能,特别是在处理中文文件名时的注意事项。理解并实践这些技术对于任何Java Web...

    java+jsp 文件下载(服务器上的文件)

    在Java和JSP中,实现文件下载是一项常见的任务,它涉及到服务器与客户端之间的交互,以及对文件流的处理。下面将详细讲解如何使用Java和JSP来实现这一功能。 首先,我们从`downloadtool.jsp`开始,这是一个用户界面...

    JSP实现文件上传与下载.pdf

    三、JSP文件下载的实现 在示例代码中,使用了自定义的UpFile.tag标签来处理文件下载。UpFile.tag标签将文件下载到客户端,使用Image标签来显示下载的文件。在UpFile.tag标签中,使用Java代码来处理文件下载,使用...

    jsp页面实现文件的下载功能

    总的来说,实现JSP页面的文件下载功能需要以下几个步骤: 1. 在HTML中创建一个链接,指向处理下载的JSP页面。 2. 在JSP页面中,使用SmartUpload或其他类似的库来处理下载逻辑。 3. 设置正确的Content-Disposition以...

    jsp页面下载文件

    在IT行业中,JSP(JavaServer Pages)是一种用于创建...通过分析这些文件,你可以进一步了解JSP文件下载的具体实现细节,以及如何与服务器的文件系统交互。记住,安全性和用户体验是设计下载功能时必须兼顾的重要因素。

    基于jsp的文件上传下载

    文件下载通常涉及生成HTTP响应,设置适当的响应头(如Content-Disposition,指示浏览器以附件形式下载文件,以及Content-Type指定文件类型),然后将文件内容写入响应流。在JSP中,可以通过Servlet或者使用JSP内置...

    jsp文件上传及下载

    2. **文件下载** - **设置响应头**:在JSP或Servlet中,我们需要设置HTTP响应头,包括Content-Type(指定文件类型)、Content-Disposition(定义附件的名称)和Content-Length(文件大小)。 - **读取文件**:从...

    Jsp文件上传下载

    总结来说,JSP文件上传下载是通过SmartUpload库实现的,它简化了文件操作的复杂性,使得开发者能更专注于业务逻辑。通过理解和实践SmartUpload的用法,你将能够为你的Web应用添加这一关键功能。同时,理解文件上传...

    使用jsp下载excel文件

    通过上述步骤,我们可以在JSP中实现将服务器上生成的Excel文件下载到客户端的功能。这种方法不仅适用于Excel文件,还可以扩展到其他类型的文件下载。开发者可以根据具体需求调整代码细节,以满足不同的应用场景。

    jsp文件上传下载

    【jsp文件上传下载】是一个常见的Web开发功能,用于在服务器端处理用户上传的文件并提供文件下载服务。在Java Web环境中,JSP(JavaServer Pages)是常用的动态网页技术,结合Servlet可以实现复杂的文件交互操作。 ...

    利用jsp实现文件上传下载

    文件上传是指将文件从客户端上传到服务器端的过程,而文件下载是指将文件从服务器端下载到客户端的过程。在 JSP 中,我们可以使用 Apache 的 Commons FileUpload 库来实现文件上传功能。 准备工作 在开始实现文件...

    jsp 实现 文件 下载 jsp代码

    jsp 实现 文件下载 jspsmartupload

    jsp文件下载

    在提供的"down"目录中,可能包含一个简单的JSP文件下载示例。该示例通常会包含上述步骤的实现,例如通过请求参数获取要下载的文件名,然后按照上述方法设置响应头,读取并发送文件内容。 总结,使用JSP实现文件下载...

    JSP文件在线预览

    在线预览JSP文件意味着用户无需下载文件到本地,而是通过浏览器直接查看其内容和效果。 要实现JSP文件的在线预览,我们需要以下几个关键技术: 1. **Web服务器**:如Apache Tomcat,它能解析和执行JSP文件,并返回...

    jsp文件上传下载jar包

    以下是关于JSP文件上传下载以及所用到的JAR包的详细解释: 1. 文件上传: 在JSP中处理文件上传,我们需要使用Apache Commons FileUpload库,具体为`commons-fileupload-1.2.jar`。这个库提供了处理HTTP多部分请求...

    JSP下载文件源代码

    根据给定的信息,本文将详细解释如何使用JSP与SmartUpload插件来实现文件下载功能。这主要包括以下几个方面的内容:理解JSP与SmartUpload的基本概念、解析提供的代码示例、以及深入探讨SmartUpload中的关键方法。 #...

    java jsp+servlet实现文件下载(而不是在网页中显示出文件内容) 迅雷下载功能.zip

    综上所述,这个项目利用了`jsp`和`servlet`的技术,通过设置正确的HTTP响应头,实现了文件下载功能,同时也考虑了迅雷等下载工具的需求。在实际开发中,还需要考虑其他因素,如错误处理、日志记录和性能优化,以提供...

    jsp文件下载实例

    本教程将通过一个具体的“jsp文件下载实例”来讲解如何在JSP页面上实现文件下载功能,同时也会涉及到Servlet的作用。 首先,我们需要理解JSP的基本原理。JSP是一种视图技术,它允许开发者将HTML代码与Java代码混合...

Global site tag (gtag.js) - Google Analytics