`

RequestDispatcher实现文件下载

 
阅读更多
本来我使用的是文件流下载的方式,在Tomcat下可行,但是在WebLogic下使用文件流下载下来的文件总是乱码,最终我妥协了,选择了RequestDispatcher方式。
1.文件流方式
js中的文件请求:window.location.href = "download.jsp?filepath="+encodeURI(responseArray.path);//filepath中含有中文
实现下载的download.jsp文件如下:
<%@ page language="java" pageEncoding="utf-8" %>
<%@ page contentType="application/x-msdownload" %>
<%@ page language="java" import="java.io.*"%>
<%@ page language="java" import="java.net.URLEncoder"%>
<%@ page language="java" import="java.util.*"%>
<%
      String file=request.getParameter("filepath");
      String filepath=new String(file.getBytes("ISO8859-1"),"utf-8" );
      response.setContentType("application/x-msdownload; CHARSET=utf-8");
      String displaypath=filepath.substring(filepath.lastIndexOf("/")+1);
      response.addHeader("Content-Disposition","attachment;filename=" + new String(displaypath.getBytes("gb2312"), "ISO8859-1" ));
      String filepathdownload=this.getServletConfig.getServletContext().getRealPath(filepath);
      OutputStream outputStream=null;
      FileInputStream inputStream =null;
      try{
               outputStream = response.getOutputStream();
               inputStream = new FileInputStream(filepathdownload);
               byte[] buffer = new byte[1024];
               int i = -1;
               while ((i =inputStream.read(buffer)) != -1)
               {
                     outputStream.write(buffer, 0, i);
               }
               outputStream.flush();
               //下面这两句在Tomcat下需要,在Weblogic下要去掉,否则出错
               out.clear();
               out = pageContext.pushBody();
      }catch(Exception e)
      {
               System.out.println("Error!");
               e.printStackTrace();
      }
      finally{
               if(inputStream!=null)
               {
                   inputStream.close();
                   inputStream=null;
               }
              if(outputStream!=null)
              {
                   outputStream.close();
                   outputStream=null;
              }
      }
%>
2.RequestDispatcher实现文件下载
<%@page language="java" import="java.net.*" pageEncoding="gb2312"%>
<%
    //如果是从前台传过来的参数就这样写
    //String filePath = "/"+request.getParameter("path");前面红字标识的“/”不能没有  
    //String fileName = request.getParameter("name"); 
    response.setContentType("application/x-download");//设置为下载application/x-download
    String filenamedownload = "/Word/作文.doc";//即将下载的文件的相对路径
    String filenamedisplay = "作文.doc";//下载文件时显示的文件保存名称
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);   
    try
    {
        RequestDispatcher dispatcher = application.getRequestDispatcher(filenamedownload);
        if(dispatcher != null)
        {
            dispatcher.forward(request,response);
        }
        response.flushBuffer();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }   
%>
注意:
1.String filenamedownload = "/Word/作文.doc";指的是即将下载的文件的相对路径,表示作文.doc文件放在工程下的Word文件夹内,一定要注意"/Word/作文.doc",Word前面一定要有“/”,不能写成String filenamedownload = "Word/作文.doc";
2.RequestDispatcher下载方式更为简单,但是缺点在于:下载的文件必须放在工程的内部,application.getRequestDispatcher()方法的参数也必须是相对路径
分享到:
评论

相关推荐

    jsp文件下载功能实现代码

    本文实例为大家分享了jsp实现文件下载功能的3种方法,供大家参考,具体内容如下 第一种、采用转发的方式: package cn.jbit.download.servlet; import java.io.IOException; import javax.servlet....

    jsp跳转的五种方式

     它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。  如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意...

    JSP面试容易问到的问题

    forward:可以在JSP页面中使用,可以在Servlet中实现。 在JSP页面中使用目标文件"/&gt;,例如要跳转到userlist.jsp,可以写: 在Servlet中使用RequestDispatcher的forward方法,要跳转到userlist.jsp,可以写: ...

    jsp中页面之间的跳转forward与sendRedirect的区别

    在JSP页面中使用”目标文件”/&gt;,例如要跳转到userlist.jsp,可以写: 代码如下: ”userlist.jsp”/&gt; 在Servlet中使用RequestDispatcher的forward方法,要跳转到userlist.jsp,可以写: 代码如下: ...

    javaWed笔记

    Filter的元素用于配置过滤器拦截的资源信息,如果想让过滤器拦截所有的请求访问,那么需要使用通配符“*”来实现 2.拦截不同方式的访问请求。 在web.xml文件中,一个元素用于配置一个Filter所负责拦截的资源。 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...

    Struts2 in action中文版

    8.2.1 RequestDispatcher,也叫做dispatcher 180 8.2.2 ServletRedirectResult,也叫做redirect 186 8.2.3 ServletActionRedirectResult,也叫做redirectAction 188 8.3 JSP替代品 189 8.3.1 VelocityResult,也叫做...

    jsp内置对象的用法

    13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 14 Servlet getServlet(String name) 返回指定名的Servlet 15 Enumeration getServlets() 返回所有Servlet的...

    java-servlet-api.doc

    通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图。 如果...

    spring security 参考手册中文版

    18.5.4多部分(文件上传) 149 在Spring Security之前放置MultipartFilter 150 包含CSRF令牌 151 18.5.5隐藏的HttpMethodFilter 151 18.6覆盖默认值 151 19. CORS 152 20.安全性HTTP响应头 154 20.1默认的安全头 154...

Global site tag (gtag.js) - Google Analytics