jsp 下载文件(转)

出自孟宪会大大的blog

Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方:
一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程序来打开所下载的文件。比如:在Windows平台上,如果用户点击的链接链接的是一个“.doc”文件的话,那么,浏览器就会启动Microsoft Word应用程序来打开它。
二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。
这种办法是可靠的,但你必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录之外的一个目录里,比如:如果你的虚拟目录是C:/Mengxianhui/Tomcat4/Website/MyApp的话,那么,存放在该目录和该目录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为“application/octet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content-Disposition,设定值为:attachment; filename = theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。下面,我们就平常最常用的JSP和ASP页面来举一个实际应用的例子。

TestFileDownload.JSP页面的例子:

<%
// 得到文件名字和路径
String filename = "MengxianhuiDocTest.doc";
String filepath = "D://";

// 设置响应头和下载保存的文件名
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition",
"attachment; filename=/"" + filename + "/"");

// 打开指定文件的流信息
java.io.FileInputStream fileInputStream =
new java.io.FileInputStream(filepath + filename);

// 写出流信息
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
%>

值得注意的是:在你要下载的文件内容里,除了文件的内容之外,不应该再附加有其它任何的字符,包括空格和回车换行符。我们有时在编写代码的时候,为了使代码清晰可读,往往会添加一些空格、制表符或者回车换行符,这样虽然看起来比较清晰,但有时可能会得不到正确的结果。比如:
<%@ page import="java.io.*"
%> <jsp:useBean id="MyBeanFromMengxianhui" scope="page"
class="com.Mengxianhui.DownloadBean" />
应该写成这样:
<%@ page import="java.io.*"
%><jsp:useBean id="MyBeanFromMengxianhui" scope="page"
class="com.Mengxianhui.DownloadBean" />

另还可以在网页中加

<%response.setContentType("application/vnd.ms-excel");%>
<%response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");%>
<%response.setHeader("Content-Disposition", "attachment;filename=/""+new String("投诉信息资料列表.xls".getBytes("GBK"),"ISO-8859-1")+"/"");%>

<%response.setContentType("application/text;charset=GBK");%><%response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");%><%response.setHeader("Content-Disposition", "attachment;filename=/""+new String("投诉信息资料列表.txt".getBytes(),"ISO-8859-1")+"/"");%>

 

下载网页中本应该显示的内容。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值