`

jsp怎么下载xml文件,弹出保存窗口,并不是显示在浏览器上

 
阅读更多

jsp下载文件的实现方法 及 注意

 

 

 

 

jsp中实现文件下载 

 

(一) 

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

但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不 安全的因素。 

 

因此可以采用其它方式实现下载,可以采用: 

 

1、RequestDispatcher的方式进行; 

 

2、采用文件流输出的方式下载。 (推荐) 

 

 

 

1、采用RequestDispatcher的方式进行 

 

 

Jsp代码 

<%    

  response.setContentType("application/x-download");//设置为下载application/x-download    

  String filedownload = "/要下载的文件名";//即将下载的文件的相对路径    

  String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称    

  String 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    

  {    

 

  }    

%>  

<%

  response.setContentType("application/x-download");//设置为下载application/x-download

  String filedownload = "/要下载的文件名";//即将下载的文件的相对路径

  String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称

  String 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

  {

 

  }

%>

 

 

 

 

 

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

 

 

Jsp代码 

<%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%>    

<%    

  //关于文件下载时采用文件流输出的方式处理:    

  //加上response.reset(),并且所有的%>后面不要换行,包括最后一个;    

 

  response.reset();//可以加也可以不加    

  response.setContentType("application/x-download");    

 

//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径    

 

String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";    

 String filedisplay = "给用户提供的下载文件名";    

  String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");    

  response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);    

 

  java.io.OutputStream outp = null;    

  java.io.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();    

//要加以下两句话,否则会报错    

//java.lang.IllegalStateException: getOutputStream() has already been called for //this response      

out.clear();    

out = pageContext.pushBody();    

}    

  catch(Exception e)    

  {    

  System.out.println("Error!");    

  e.printStackTrace();    

  }    

  finally    

  {    

  if(in != null)    

  {    

  in.close();    

  in = null;    

  }    

//这里不能关闭      

//if(outp != null)    

  //{    

  //outp.close();    

  //outp = null;    

  //}    

  }    

%>  

<%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%>

<%

  //关于文件下载时采用文件流输出的方式处理:

  //加上response.reset(),并且所有的%>后面不要换行,包括最后一个;

 

  response.reset();//可以加也可以不加

  response.setContentType("application/x-download");

 

//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径

 

String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";

 String filedisplay = "给用户提供的下载文件名";

  String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");

  response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);

 

  java.io.OutputStream outp = null;

  java.io.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();

//要加以下两句话,否则会报错

//java.lang.IllegalStateException: getOutputStream() has already been called for //this response  

out.clear();

out = pageContext.pushBody();

}

  catch(Exception e)

  {

  System.out.println("Error!");

  e.printStackTrace();

  }

  finally

  {

  if(in != null)

  {

  in.close();

  in = null;

  }

//这里不能关闭  

//if(outp != null)

  //{

  //outp.close();

  //outp = null;

  //}

  }

%>

 

 

 

 

 

对于第二种方法,我认为应该是比较常用的。不过有几个地方是值得我们注意的: 

 

一、采用第二种方法的主要优点是实际文件的存放路径对客户端来说是透明的。 

这个文件可以存在于任何你的服务器能够取得到的地方,而客户端不一定能直接得到。例如文件来自于数据库或者内部网络的一个FTP服务器。还句话说,这种方式可以实现隐藏实际文件的URL地址。 

 

二、为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件),你必须在响应头里加入强制下载的MIME类型: 

response.setContentType("application/force-download");//设置为下载application/force-download 

这样,就可以保证在用户点击下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序,除非你设置了浏览器的一些默认行为。 

或者,你想让客户端自行处理各种不同的文件类型,你可以在服务器的配置文件中配置MIME类型映射,通过简单的判断文件后缀名来处理。例如,在Tomcat中设置MIME响应类型: 

如果文件在客户端中的响应程序类型和期望不一致,修改$TOMCAT_HOME\conf\web.xml文件中的如下部分 : 

<mime-mapping> 

  <extension>zip</extension> 

  <mime-type>application/zip</mime-type> 

</mime-mapping> 

<mime-mapping> 

  <extension>mht</extension> 

  <mime-type>message/rfc822</mime-type> 

</mime-mapping> 

…… 

 

三、在响应头中尽量不要设置浏览器缓存期限。 

有时候用户在点击了下载链接后,在弹出窗口中,用户想直接点击“打开”,而不想保存到指定路径。这时候如果我们在响应头中限制了不允许使用浏览器缓存(即总是刷新),在IE浏览器中我们将无法直接打开该文件。因为限制了不允许使用缓存,浏览器无法将文件保存到临时文件夹(即缓存)。 

也就是说,在响应头中不要进行如下的设置(已注释): 

  //response.addHeader("pragma","NO-cache"); 

  //response.addHeader("Cache-Control","no-cache"); 

  //response.addDateHeader("Expries",0); 

 

四、文件名为中文或其他unicode字符时的处理。 

有时候提供下载的文件名中包含中文字符或者其他unicode字符,会导致浏览器无法正确的采用默认的文件名保存文件。我们应该记住在响应头中包含filename字段并采用ISO8859-1编码(推荐)或者采用UTF-8编码: 

response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("UTF-8"),"iso8859-1")); //采用ISO8859-1编码 

response.setHeader("Content-disposition","attachment; filename="+URLEncoder.encode(filename, "UTF-8")); //采用UTF-8编码 

但是,这种方式在不同的浏览器中表现也有所不同。例如在IE和Firefox中,采用ISO8859-1编码可以正确显示文件名,而在Opera中不管采用那种编码,默认保存的文件名都无法做到正确显示。 

所以最好的方法其实就是尽量在文件名中使用ascii编码。 

 

五、由于采用流的方式进行输入输出,我们必须保证在使用完毕后关闭流的资源。 

一般我们把关闭流的操作放在finally块中,以保证在程序段结束前一定会关闭流的资源: 

 

InputStream is = null; 

ServletOutputStream sos = null; 

try { 

  is = ...; //通过某种方式读进数据到输入流 

  sos = response.getOutputStream(); //打开输入流 

  byte[] buff = new byte[2048]; 

  int bytesRead; 

  while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 

  sos.write(buff,0,bytesRead); 

  sos.flush(); 

  } 

} catch(IOException ex) { 

  //TODO something with IOException 

} catch(Exception ex) { 

  //TODO something with Exception 

} finally { 

  if(is != null) { 

  is.close(); //关闭输入流 

  } 

  if(sos != null) { 

  sos.close(); //关闭输入流 

  } 

}  

 


最后解决

<% response.setContentType("application/x-download");    

String filedownload = "/35.xml";    

String filedisplay = "sss";    

String 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();    

}    

   %>

 

设置响应的ContentType即可。如下:
response.reset(); 
 response.setContentType("application/x-msdownload"); 
 response.addHeader("Content-Disposition","attachment; filename=\"" + attch_name + "\"");
分享到:
评论

相关推荐

    用JSP实现的上传下载功能

    在这个例子中,Servlet读取指定的文件,设置适当的响应头,使得浏览器弹出下载对话框,而不是直接在浏览器窗口中显示内容。 以上就是使用JSP实现上传和下载功能的基本方法。在实际开发中,还需要考虑错误处理、...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    70. jsp直接弹出下载框下载文件? 71. 配置数据连接池和数据源(Tomcat)? 72. 点击图1变为图2? 73. JSP中显示图片的方法之一? 74. int转为Integer的方法? 75. 请求jsp页面禁止缓存方法? 76. select选中其中的值自动...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    CSS大家很熟悉了,全称是Cascading Style Sheets(层叠样式表),是目前用来在浏览器上显示XML文档的主要方法。 3.Behaviors Behaviors现在还没有成为标准。它是微软的IE浏览器特有的功能,用它可以对XML标识设定...

    jsp编程技巧集锦

    jsp直接弹出下载框下载文件? 71. 配置数据连接池和数据源(Tomcat)? 72. 点击图1变为图2? 73. JSP中显示图片的方法之一? 74. int转为Integer的方法? 75. 请求jsp页面禁止缓存方法? 76. select...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    在IDEA中构建Spring Boot + JSP项目

    打开IDEA,选择"New Project",然后在弹出的窗口中选择"Spring Initializr"。在"Group"和"Artifact"中输入项目的组ID和 artifact ID,这将决定你的项目包结构。接着,选择"Java"作为语言,并设置项目版本,通常选择...

    myeclipse中jsp的preview中文乱码完美解决方案

    2. 在弹出的窗口中,依次选择“General”-&gt;“Content Types”-&gt;“Text”。 3. 在右侧找到“File Associations”选项卡,找到“*.jsp”文件类型,确保其编码为UTF-8。 4. 同样地,在“General”-&gt;“Editors”-&gt;“Text...

    JavaScript网页特效范例宝典源码

    实例005 控制弹出窗口居中显示 7 实例006 弹出的窗口之Cookie控制 9 实例007 为弹出的窗口加入关闭按钮 11 实例008 关闭弹出窗口时刷新父窗口 12 实例009 关闭IE主窗口时,不弹出询问对话框 13 1.2 弹出网页对话框 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

    tmocat及MyEclipse安装文件

    - **第二步:** 保存并关闭`server.xml`文件。 - **第三步:** 重启Tomcat服务器。可以通过命令行或者控制面板来重启。 - **第四步:** 在浏览器中输入“http://localhost/”(假设端口为80,如果修改了端口,请相应...

    常见软件开发平台搭建实验常见问题以及解决方法

    2. **取消IIS勾选:** 在弹出的窗口中找到“IIS”组件,取消其前面的复选标记,然后点击“下一步”按钮,系统将开始卸载IIS组件。 #### 三、ASP.NET开发环境搭建中的常见问题及其解决策略 在搭建ASP.NET开发环境时...

    java源码包2

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java源码包3

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    java源码包4

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    当展开菜单时,自动向服务器发送请求,查询该菜单下的子菜单,并在客户端显示子菜单,而无需刷新整个页面。 /simpleTree.jsp 简单树 /staticTree.jsp 静态树 /dynamicTree.jsp 动态树 /css/tree....

    400个DreamWeaver插件

    如果做很多弹出窗口的话,这个插件比DW自带的open browser window方便一些 mxp/一些Flash Button,一共7款 mxp/Winamp和Dreamweaver都是软件中的精品,有了这个插件,你可以方便的在DW中控制Winamp。边工作,边听...

    Win7配置JBoss教程

    - 在弹出的“系统属性”窗口中切换到“高级”选项卡,点击“环境变量”。 2. **添加JBoss路径**: - 在“系统变量”区域中找到`Path`变量,并编辑它,在变量值末尾加上分号,然后添加JBoss的bin目录路径(例如:`...

    用MyEclipse建立Struts图解

    8. **创建JSP页面**:在WebContent目录下创建一个名为“HelloWorld.jsp”的JSP文件,用于显示结果。在JSP中使用Struts标签来显示Action返回的数据。 9. **运行项目**:在MyEclipse中右键点击项目,选择“Run As” -...

    eclipse jee 热部署配置图解

    - 在弹出的“编辑运行时环境”窗口中,确认你的工作空间(Workspace)的“类路径容器”(Classpath Container)设置正确,通常应指向Apache Tomcat的lib目录。 2. **设置发布类型**: - 双击你创建的Tomcat服务器...

Global site tag (gtag.js) - Google Analytics