Jsp页面的三种下载方式

声明:非原创,内容大多来自网络,再加上我自己一点点的实践体会。


1 链接或重定位

a

a>
response.sendRedirect(downPath);
b>
request.getRequestDispatcher(downPath).forward(request, response);

最简单的方式是在网页上做超级链接,如:<a href="music/abc.mp3">点击下载</a>。

优点:

实现最简单。

缺点:

但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不安全的因素。因此可以采用其它方式实现下载


采用RequestDispatcher的方式进行

<%  
      response.setContentType("application/x-download");//设置为下载application/x-download  
      String filedownload = "/要下载的文件名";//即将下载的文件的相对路径  
      String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称  
      filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");  
      response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);  
      
      try  
      {  
          RequestDispatcher dis = application.getRequestDispatcher(filedownload);  
          if(dis!= null)  
          {  
              dis.forward(request,response);  
          }  
          response.flushBuffer();  
      }  
      catch(Exception e)  
      {  
          e.printStackTrace();  
      }  
      finally  
      {  
      
      }  
%>  

需要下载文件的相对路径。

实际 测试中没有通过,没有下载成功,提示下载文件名也不对


采用文件流输出的方式下载

%@page language="java" contentType="application/x-msdownload"    pageEncoding="gb2312"%><%  
  //关于文件下载时采用文件流输出的方式处理:  
  //加上response.reset(),并且所有的%>后面不要换行,包括最后一个;  
  
  response.reset();//可以加也可以不加  
  response.setContentType("application/x-download");  
  String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";  
  String filedisplay = "给用户提供的下载文件名";  
  filedisplay = URLEncoder.encode(filedisplay,"UTF-8");  
  response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);  
  
  OutputStream outp = null;  
  FileInputStream in = null;  
  try  
  {  
      outp = response.getOutputStream();  
      in = new FileInputStream(filenamedownload);  
  
      byte[] b = new byte[1024];  
      int i = 0;  
  
      while((i = in.read(b)) > 0)  
      {  
          outp.write(b, 0, i);  
      }  
      outp.flush();  
  }  
  catch(Exception e)  
  {  
      System.out.println("Error!");  
      e.printStackTrace();  
  }  
  finally  
  {  
      if(in != null)  
      {  
          in.close();  
          in = null;  
      }  
      if(outp != null)  
      {  
          outp.close();  
          outp = null;  
      }  
  }  
;  

实际测试中,提示错误:

getOutputStream() has already been called for this response 

具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();


测试通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值