让网页附件为Word或Excel的文件,下载时直接弹出下载对话框,而不打开它
直接让客户端浏览器下载已知类型的文件
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”标签页进行设置即可!!
让网页附件为Word或Excel的文件,下载时直接弹出下载对话框,而不打开它相关推荐
- IE浏览器下载excel文件时不弹出下载保存提示框的解决方法
在IE浏览器中下载文件的时候,下载保存的提示框不弹出了,特意咨询了一下解决的方法,特来和大家分享. 1.打开"我的电脑"后请点击工具列的:"工具 -- 文件夹选项&quo ...
- 怎么在公众号添加附件链接(Word、Excel、Pdf等)
因为微信公众号编辑器上没有提供明确的附件功能,导致很多小伙伴可能都不知道微信公众号是怎么上传附件的.有些小伙伴使用秀米编辑器,怎么在秀米编辑器文章中插入附件呢? 我们作为一个公众号运营者都知道,在微信 ...
- javascript将网页表格导出Word和Excel
javascript将网页表格导出Word <script> function AllAreaWord() { if(document.all("tab").ro ...
- 关于Java项目中,word和Excel类型文件的预览功能实现
关于Java项目中,word和Excel类型文件的预览功能实现 背景 Aspose说明 Aspose.Words Aspose.Cells pom依赖引入 引入license.xml(授权文件) 创建 ...
- win10搜索计算机中所有excel,win10系统无法搜索到word、excel等文件内容的处理技巧...
今天和大家分享一下win10系统无法搜索到word.excel等文件内容问题的解决方法,在使用win10系统的过程中经常不知道如何去解决win10系统无法搜索到word.excel等文件内容的问题,有 ...
- Google word、excel、ppt (Chrome)浏览器插件下载
Google word.excel.ppt (Chrome)浏览器插件下载 [插件简介] 使用Google文档.表格和幻灯片来查看和编辑Microsoft Word.Excel和PowerPoint文 ...
- 如何快速搜索多个word、excel等文件中内容
如何快速搜索多个word.excel等文件中内容 一.问题背景 很多同事都会搜索word.exce1等文件中的内容,但是如果现在有100个word文件,分散在多个文件夹,而想找到这100个word文件 ...
- Android调用第三方WPS打开word,excel等文件
项目中遇到了使用第三方软件打开word,excel等文件的需求,最后是考虑用wps来打开这些软件.从网络上搜集了很多别人的代码,整理出来梳理一遍流程,做出一个小demo,实测可用. 限制:被打开的文档 ...
- 打开word时总是弹出The resource dll can not be loaded
打开word时总是弹出"The resource dll can not be loaded" 解决: 打开word,文件->选项->载项,取消勾选"Micr ...
- JAVA导出excel 直接弹出下载框
效果展示: 1.首先准备jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>po ...
最新文章
- python3使用SQLALchemy报错No module named ‘MySQLdb‘
- wxWidgets:wxMaximizeEvent类用法
- CentOS7下安装zookeeper3.4.9
- 取消centOS7虚拟机锁屏
- SpringMVC 入门教程
- windows下PHP拓展包的选择
- 数据库死锁,导致CPU异常增长
- 尚硅谷大数据技术之Sqoop
- UML期末大作业——《UML系统分析与设计》
- CAD看图软件的快速搜索功能怎么用?
- jsp遍历List map
- Oracle中Blob转换成Clob
- Java——将汉字转为汉语拼音工具类
- PHP MySQL 连接数据库
- spring 容器启动执行重置定时任务
- 业余学Python是如何挣钱的?
- Spring Cloud Gateway 整合 knife4j 聚合接口文档
- mysql ddl ddm_数据库ddl ddm语句
- CodeGear RAD 2007 up4最新下载及破解
- 离散度计算公式 python_Python中离散点的坡度计算
热门文章
- 【路径规划】基于matlab遗传算法求解多式联运运输问题【含Matlab源码 877期】
- shader 反射 水面_大规模水面渲染
- 深度学习计算机视觉的简介_商业用途计算机视觉简介
- xtragrid 某个值 查找_EXCEL查找引用函数:如果只推荐一个EXCEL函数,那就是这个了...
- kettle 内存设置_Kettle大数据量转换报错ora-04030: 在尝试分配484字节时进程内存不足...
- pythonweb程序设计_Python编程实现的简单Web服务器示例
- 好程序员Java分享JVM类加载机制
- 浅析ServiceMesh Istio
- 【零基础入门】 css学习笔记(5) 浮动
- 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)