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文件下载功能的4种方法 对于网站来说,网站本身常常需要提供一些资源或者资料进行下载,说到下载莫过于最原始的方法就是在网页上提供下载的网址。今天讲述的还有另外的几种实现文件下载的方法,对于哪种方法更好这也是看自己的需求。 1、最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。  2、在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地,示例如下: <% response.setContentType(fileminit 立即下载

相关推荐

《科研伦理与学术规范》期末考试答案2023

26单选(2 分)某学术杂志的评稿人同时是某高校相关专业的硕士生导师,在评判一个稿件的时候,他发现该作者研究的题目很有价值, 他便一边压下这个稿子,一边将稿子的纲要传给自己门下的硕士生, 指导他们使用这个题目独立写出一篇论文,并帮助他们发表在其他期 刊上。D.要善待实验动物,是指在饲养管理和使用实验动物过程中,要采取有效措施,使实验动物免遭不必要的伤害、饥渴、不适、惊恐、折磨、疾病和疼痛,保证动物能够实现自然行为,受到良好的管理与照料,为其提供清洁、舒适的生活环境。张某在压力之下不得不屈从。

Glenseeds的博客 4万+

jsp中实现文件上传下载的三种解决方案(推荐)

大致实现原理:当enctype的值是multipart/form-data时,浏览器会把每个表单项进行分割,分割成不同的部件,以boundary的值为分割标识,这个标识的字符串是随机生成的,最后一个表单项的分割标识字符串末尾会多两个”- -“,代表结束。支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能够上传。

Mr_Zang666的博客 2261

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2967

jsp实现下载文件

jsp实现下载文件功能

qq_58863774的博客 1655

C语言--第三大的数

第三大的数 给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数. 示例1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例2: 输入: [1, 2] 输出: 2 解释: 第三大的数不存在, 所以返回最大的数 2 . ...

loreal8的博客 2130

摄像头visio_最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了

原标题:最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了不会用Visio,Visio画拓扑画的很丑,怎么办?本期sin66小编免费分享一份最全面的弱电智能VISIO图标集(百个)给大家,以后画拓扑、做方案,直接高大上起来!需要本期资料直接看文末!!接下来我们一起看一下这些Visio图标大全:我们从下图可以看出前端设备主要是由枪机,筒机,无线摄像头,半球,球机,USB摄像头等构成,对于绘...

weixin_39644915的博客 1万+

JSP实现文件下载应注意的几个问题

用JSP实现文件下载的方式就像我上一篇转载的文章一样,主要有这两种方法:1、RequestDispatcher的方式进行2、采用文件流输出的方式下载第一种方式我没用过,不大熟悉。对于第二种方法,我认为应该是比较常用的。不过有几个地方是值得我们注意的:一、采用第二种方法的主要优点是实际文件的存放路径对客户端来说是透明的。这个文件可以存在于任何你的服务器能够取得到的地方,而客户端不一定能直接得到。例如

身体健康的专栏 6721

FTPClient使用中,碰到SocketTimeoutException 坑

ftpclient设置soTimeout无效

u010379794的博客 1950

jsp下载详细过程(windows 11)

windows11系统jsp详细过程

weixin_57642142的博客 4407

Winform零基础从入门到精通(3)——WinForm基础语法与事件机制详解

通过系统学习基础语法与事件机制,结合实际问题调试,可以快速掌握WinForm开发的核心技能。遇到问题时,优先检查事件绑定和异常处理,逐步培养代码规范意识。​安全转换字符串为数值,避免输入错误导致的崩溃。验证输入(如仅允许数字)​)传递事件相关数据。◦ 事件参数类型:​。

WangMing_X的博客 1492

从MIPS汇编到C语言:手把手教你用Mars模拟器理解指令集(附实战代码)

本文详细介绍了如何使用Mars模拟器从MIPS汇编过渡到C语言编程,通过实战代码解析ADD、LW、BEQ等指令集与C语言结构的对应关系。内容涵盖环境搭建、算术运算、内存访问、条件分支及函数调用等核心概念,帮助读者深入理解MIPS指令分类和计算机底层运行机制。

weixin_26821003的博客 357

easyui下弹出窗口下载文件

jsp function kpdc1(){             var rows = $("#xxx").datagrid('getRows');             var datarows = JSON.stringify(rows);                         var url = 'url?datarows='+datarows                w...

qq_25333595的博客 3532

Cadence SIP Layout 简单教程-第一章

以摄像头模组软硬结合板为例,描述layout的整个完整过程,从而掌握基本技能。 第一章 准备工作 第一节 原理图不用说layout前需要绘制原理图,原理图不在本文讨论范围内,所以列为准备工作。 需要特别说明的是,绘制原理的最终目的是导出网络表,网络表中的重要参数footprint是让layout软件选择正确封装的关键,所以这里讲解一下原理图设置footprint的位置。在原理图中双击零件,...

whp1920的博客 1万+

struts2实现文件下载

struts.xml文件: text/plain inputStream attachment;filename="${filename}" 2048 参数解释:contentType 内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,

红酥手,黄縢酒,满城春色宫墙柳。东风恶,欢情薄。一怀愁绪,几年离索。错、错、错。 542

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Eclipse编写jsp文件连接Mysql数据库的安装配置指南

利用Eclipse编写jsp文件连接Mysql数据库 我的环境背景:Windows8,已安装的jdk1.7.0_80和Mysql

coffee_cream的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java转换word为htm文件并嵌入jsp页面_将jsp页面转换为word格式

每个人都知道,自己制作动态jsp网页通常非常简单. 启动服务器并加载您自己的可爱的jsp已完成. 我们心爱的jsp出来了. 网页上令人眼花interface乱的界面是否非常吸引人?您要保存吗?哈哈,你一定想!因为那是您一次键入一个字母的内容,并且当然要保存人工结果,所以可以1. 制作自己的jsp网页,请记住保存它,否则将无济于事.2. 打开tomcat目录下的conf文件夹,您将看到一个名为web...

weixin_39615219的博客 232

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

直接让浏览器下载文件而不打开

直接让客户端浏览器下载已知类型(*.doc)的文件 ,而不使用关联程序打开。 Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件(*.doc),发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。 以前我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方: ...

大阳阳 601

下载docx变成jsp_把jsp页面转换成word格

对于很多时候看到我们喜欢的网页页面,实在是很炫很酷,想要保存下来,可是这时候我们往往素手无策,如何做到保存自己喜欢或是很急需用的jsp网页呢,下面我就自己的一点小小想法,跟大家分享一下啦,想进一步了解的可以加我984814676大家都知道,自己制作动态jsp网页往往很是简单,启动服务器,加载自己可爱的jsp就一切大功告成了,我们心爱的jsp就出来啦,网页上炫炫的界面是不是很诱人?想不想保存下来?哈...

weixin_39916549的博客 523

学习JSP——在虚拟机中建立一个JSP网页,通过Tomcat服务器发布,并通过虚拟机的宿主机浏览器访问虚拟机上所发布的JSP网页

1、介绍JSP (1)简介 JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以&amp;amp;amp;lt;%开头以%&amp;amp;amp;gt;结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。 JSP通过...

张海玲的博客 1837

Tomcat jsp

转贴说明, 自我感觉这个讲的不是太全面, 但是对于初学者也许上手快些 配置Eclpise+tomcat并实现JSP的编写与部署http://script.xhtmlhelp.net/jsp/200610/880.shtml配置Eclpise+tomcat并实现JSP的编写与部署一.下载J2SDK下载http://java.sun.com/j2se/1.4.2/downlo

ridrare的专栏 1410

Java开发在线打开编辑保存Word文件(支持多浏览器)

Java调用PageOffice实现在线编辑保存Word文件(以jsp调用为例,支持SSM、SSH、SpringMVC等流行框架) 1. 下载PageOffice开发包:http://www.zhuozhengsoft.com/dowm/ 下载PageOffice for JAVA 2. 以Myeclipse为例,新建一个Web Project,比如:wordonline 3. 解压P...

zi_wu_xian的专栏 408

【JavaWeb】XML Tomcat10 HTTP

xml配置文件;Tomcat选择、IDEA中的配置运行;HTTP请求响应报文

Orion 1400

JSP架构搭建

JSP架构搭建

m0_66488211的博客 466

新手伤不起啊,esclipse中servlet和jsp的配置,也许,404并不是路径问题

前几天突发奇想要来学一下jsp,熟悉了一下jsp/servlet,正兴致勃勃要来操作的时候却发生了杯具。 在tomcat目录下面配置jsp,servlet,javaBean很容易就成功了,但是到了在esclipse配置的时候却从昨天搞了今天,杯具。目前不完全知道是什么问题造成的。 首先,下载tomcat安装版,端口除非必要还是不要乱改了,因此重装了一次。 网上找了一篇配置的,一路成功,需要注

vsooda的专栏 6755

Jsp_Config

 经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题,于是总结了一下如何tomcat下配置jsp、servlet和ben,希望对那些初学者有所帮助。 第一步:下载j2sdk和tomcat:到sun官方站点(http://java.sun.com/j2se/1.4.2/download.html)下载j2sdk,注意下载版本为Windows Offline In

人生可不可以停下来休息休息 1420

31-Tomcat搭建Web项目和XML解析

Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat、Resin、JBoss、WebSphere 和 WebLogic 等。

美好开始来了 983
上一篇: qq能上线 但是网页看不了
下一篇: root 身份登录“鉴定故障”解决方法!
java_doom
博客等级 码龄20年 6粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值