为什么浏览器上会直接打开.rar, .xls文件, 而不是弹出下载对话框??(马上给分)

Goal3 2004-08-26 12:03:40
我用的是Tomcat5.0.19, 在jsp文件中用<a href="test.rar">down</a>来下载一个文件,
按理说应该会弹出一个下载文件的对话框, 但它在浏览器中直接打开了, 全是乱码.这是为什么?
头疼啊.
...全文
3118 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yzh315 2005-04-05
谢谢
回复
bjblz 2004-08-30
<web-app>

<mime-mapping>
<extension>zip</extension>
<mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xls</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
<mime-mapping>
<extension>rar</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>

</web-app>
回复
willma 2004-08-30
up
回复
Goal3 2004-08-30
好痛苦.
回复
gjd111686 2004-08-27
"想浏览器直接打开关联的程序",这个不太现实,复合文档技术必须有关联程序注册.如果没有就不行,否者Response.ContentType="pdf文件mime就可以"
回复
Goal3 2004-08-27
我也觉得有没有什么好的方法, 非要用到文件流的方式吗? 这样每次都会有下载的窗口出来啊
回复
cdmhua 2004-08-27
up
回复
pengpong 2004-08-27
up
回复
hyq0077 2004-08-26
在web.xml加入

<web-app>

<mime-mapping>
<extension>zip</extension>
<mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xls</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
<mime-mapping>
<extension>rar</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>

</web-app>
回复
老万2018 2004-08-26
同意bjzhanghao(八进制·WS新手)的意见,我以前就是这么解决的。
回复
Goal3 2004-08-26
zmybest(杨过) :我的jsp放在webapps/root/test下,
回复
bjzhanghao 2004-08-26
response.setContentType("application/octet-stream");
试一试,还有一个可能是客户端机器设置了文件类型关联,而关联的程序不对。如果是windows,可以在文件夹选项里选择文件类型,找到rar然后选高级,勾上“下载后确认打开”这个选项。或者删除这个关联也行。
回复
zmybest 2004-08-26
你的jsp文件放在哪里?
回复
hhl00 2004-08-26
楼上的要求刚好跟我相反,我还想浏览器直接打开关联的程序,不知大家有没有好的意见。例如pdf格式,不要弹出下载的对话框,直接调用相关程序下载。
回复
bzm888 2004-08-26
楼上能不能讲的再具体点啊?怎么使用你这段jsp代码啊?
回复
gjd111686 2004-08-26
直接让客户端浏览器下载已知类型的文件


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" />

TestFileDownload.ASP页面的例子:

在ASP里,没有提供从文件读取文件流信息的方法,因此,为了得到文件的流信息,我们必须借助其他的工具,最简单的就是编写一个VB或C的DLL组件,让组件返回文件的流信息。下面是一个用VB编写的DLL的例子,工程名字为MengXHFileDownLoad,类模块的名字为BinReadFromFile,类方法readBinFromFile如下:

Function readBinFromFile(ByVal bfilename As String) As Variant
Dim fl As Long
Dim FileNum As Long
Dim binbyte() As Byte
Dim binfilestr As String

On Error GoTo errHandler
FileNum = FreeFile
Open bfilename For Binary As #FileNum
fl = FileLen(bfilename)
ReDim binbyte(fl)
Get #FileNum, , binbyte
Close #FileNum
readBinFromFile = binbyte
Exit Function

errHandler:
Exit Function
End Function

把上面的代码编译成MengXHFileDownLoad.DLL,然后注册即可使用。下面以直接下载一个When A Man Loves A Woman.mp3的MP3文件为例子,我们要编写的ASP脚本代码如下:

<%@ Language=VBScript %>
<%
Response.buffer = TRUE
Response.ContentType = "APPLICATION/OCTET-STREAM"
Response.AddHeader "Content-Disposition","attachment;filename=When A Man Loves A Woman.mp3"

Dim varStream, oMyObject

Set oMyObject = Server.CreateObject("MengXHFileDownLoad.BinReadFromFile")
varStream = oMyObject.readBinFromFile("E:\MengXianhui\Mp3\When A Man Loves A Woman.mp3")
Response.BinaryWrite(varStream)
Set oMyObject = Nothing

Response.End
%>

当我们运行上面的TestFileDownload.ASP文件时,浏览器会弹出一个文件下载的对话框,提示我们下载,而不是用默认的MP3播放器打开。
这种方法也可以把我们的ASP页面生成的HTML源代码保存成一个文件,下面的代码会提示你把ASP执行的结果保存成Test.htm文件。具体的方法是:
<%
Response.ContentType = "APPLICATION/OCTET-STREAM"
Response.AddHeader "Content-Disposition","attachment;filename=Test.htm"
Response.write "<div style='background-color:navy;color:#FFFFFF'>测试</div>"
Response.write "<a href='http://lucky.myrice.com'>"
Response.write "<img src='http://lucky.myrice.com/back.jpg'>【孟宪会之精彩世界】</a>"
Response.End
%>

当我们的文件数目很少时,也可以直接在服务器端进行设置,让这些文件直接下载。具体做法是:在Internet服务管理器里,选“属性”项,然后选“HTTP Headers”标签页进行设置即可!!
回复
drugon 2004-08-26
up
回复
cuij7718 2004-08-26
楼上的解释正确
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-08-26 12:03
社区公告
暂无公告