一、什么是文件下载
首先,什么是文件?
我的理解,对于计算机世界而言,文件是数据存储的基本单位,是计算机硬件存储数据的软件抽象。对于软件层面的数据存储而言,任何表现的数据存储本质上都是文件。
其次,什么是下载?
我的理解,下载是数据传输的方式之一,计算机的数据可以有很多的传输方式,可以通过数据线拷贝到硬盘,可以通过打印机输出到A4纸,也可以将一台机器上的数据通过网络上传到某一个服务器,也可以从服务器下载数据到客户端等,所以我觉得这里的拷贝、打印、上传、下载本质上都是一样的,区别可能就是通道不一样,目的地不一样等。将好比是同样是从A地到B地,我们可以说是打的、坐公交、驾车、步行、坐地铁等。
二、浏览器下载
总所周知,浏览器是通过请求(request)和响应(response)和服务器的交互的,实际上我们可以将服务器的每一次response都看成是一次下载,只是下载下来的内容有的浏览器自己打开(html,img等),有的需要借助其他的工具打开(word,excel等),有的浏览器无法打开也不需要借助其他软件打开,而是提示用户是否保存该文件,我们今天要探讨的就是第三种情况,为了方便起见,我们以下所说的下载特指第三种情况。
三、MIME类型
在说浏览器下载之前,先来了解一下MIME类型。
MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
(参考百度百科)
简单的说MIME类型就是response告诉浏览器返回的文件类型。
四、response对象的contenttype属性
Response对象有一个叫contenttype的属性,它定义服务器发送给客户端内容的MIME类型。
response.setContentType("application/octet-stream");
我们知道,在网页编程中我们有时将超链接指向一个Word或Excel文件,当用户点击这个链接时浏览器会自动调用对应方法将这个文件打开。之所以能做到这点就是因为用户机器上安装office后会在浏览器中注册对应的MIME资源类型。比如说word文件的MIME类型是Application/msword(前者是MIME类型,后者是MIME子类),Excel文件的MIME资源类型是Application/msexcel。
事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型,比如说html文件的MIME类型是Text/html,JPG文件的MIME类型是Image/JPG。
在与服务器的交互中,浏览器就是根据所接受数据的MIME类型来判断要进行什么样的处理,对html、JPG等文件浏览器直接将其打开,对Word、Excel等浏览器自身不能打开的文件则调用相应方法打开。对没有标记MIME类型的文件,浏览器则根据其扩展名和文件内容猜测其类型。如果浏览器无法猜出,则将它作为application/octet-stream。要了解各种文件的MIME类型,请在win98 我的电脑->查看->文件夹选项->文件类型 中查看。
五、attachment和inline
通过以上学习,我们了解到浏览器是通过response对象的contenttype处理响应文件的,那么对于浏览器不能打开的文件,其实浏览器还是有两个选择,一是以上所说的提示用户保存或者调用用户安装的软件打开,二是浏览器无论如何都会尝试将其打开。
到底是选择哪种方式,浏览器是通过response的header属性中的attachment和inline
判断的。
//提示用户保存
response.addHeader("Content-Disposition","attachment;filename=" + fn);
//浏览器无论如何尝试打开
response.addHeader("Content-Disposition","inline;filename=" + fn);
六、文件下载的实现方式
方式一:直接网页上做超级链接,如:
[url=download/jre-windows-i586.exe]点击下载[/url]
不难理解,如果我们的servlet容器没有对*.exe的请求拦截处理,servlet容器会创建request请求对象,读取指定目录下的资源,然后通过response对象返回到客户端浏览器,
此时的response的contenttype的MIME类型可能是servlet容器通过文件后缀名自己设置的,我们可以通过一些http抓包工具进行查看。
这种实现下载的方式很简单,因为servlet容器为我们做了一切事情,但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不安全的因素。
方式二:基于第一种方式的不安全性,我们可以将servlet容器帮我们做的事情自己来做。即,客户端不直接访问我们服务器的资源目录,而是访问我的一个servlet(jsp,Action等),我们自己去读取资源,然后通过response对象返回给客户端。
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletResponse response = (HttpServletResponse)res;
File file = new File("path");
// 取得文件名。
String filename = file.getName();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream("path"));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response, 设置response的Header
response.reset();
response.addHeader("Content-Disposition",
"attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
response.setContentType("application/octet-stream");
OutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(buffer);
out.flush();
out.close();
}
我了解的文件下载方式大致就这两种,很多文章所说的local本地下载,url远程下载,RequestDispatcher下载等方式本质上都是通过设置response对象输出流到客户端,并且设置response的contenttype、header等,万变不离其宗,二进制流的来源可以是任意地方、框架对response的封装等导致文件下载有很多的表现形式。
我们只需要抓住本质,举一反三,触类旁通即可。
参考文章:
http://jeff312.iteye.com/blog/494065
http://www.189works.com/article-42222-1.html
http://www.cnblogs.com/zyxzhsh/archive/2010/12/02/1894089.html
分享到:
相关推荐
"Fish文库文档下载工具"的核心功能在于其对多种文档网站的兼容性,能够突破常规的在线预览限制,将文档转化为可本地存储的PDF文件。这样,用户就可以随时随地查阅,无需依赖网络连接,极大地提高了学习和工作的效率...
在线文档下载器可能使用此库来解析和处理从网站下载的PDF文件,确保用户可以本地存储和阅读这些文档。 “iDocDown.exe”是主程序执行文件,是在线文档下载器的核心部分。它包含了实现下载功能的算法和逻辑,能够...
6. **新建 文本文档.txt**:这可能是示例中的一个测试文件,用于演示如何通过Ajax进行下载。在实际应用中,这个文件的名称和类型将由用户选择或由业务逻辑决定。 具体实现步骤: 1. **前端**:在JSP文件中,使用...
【原创力文档下载工具】利用Python下载原创力文档是一个典型的Web爬虫应用场景,它涉及到Python编程语言、网络请求、文件处理以及可能的HTML解析技术。在这个项目中,开发者使用Python来自动化获取并下载原创力平台...
这些工具能够解析百度文库的页面,抓取文档内容并将其转换成本地文件。使用这类工具时,用户需要复制百度文库文档的网页链接,然后粘贴到工具的输入框内,按照提示进行操作。值得注意的是,这种方法可能受制于网站的...
标题 "不需要会员的文档下载器" 暗示了我们讨论的主题是关于一款能够帮助用户免费下载各种在线文档的工具,无需订阅或购买网站的会员服务。这种软件通常适用于那些提供付费阅读或下载服务的平台,例如学术论文库、...
标题中的“超级好用的百度文档下载工具”指的是一个专门设计用于从百度文库下载文档的应用程序。这个工具旨在提供一种高效、简便的方式来获取百度文库中的资源,从而避免在线阅读时可能出现的不便,比如广告干扰、...
萝卜头文档下载器是一款Windows端的免费文档下载工具,可以帮助我们下载各种常用文档,降低获取成本!软件下载好后无需安装,就可以直接打开使用。 界面非常的干净整洁,支持下载的范围也非常广泛,支持范文、协议书...
【标题】"完整版文件下载王.rar" 暗示我们正在处理一个关于文件下载工具的压缩包。这个工具可能是为了提高用户下载大文件或多个文件的效率而设计的,通常具备断点续传、多线程下载等功能,使得用户在下载过程中能够...
豆丁网免费下载器(冰点)无需登录也无需积分,只需要将需要下载的文档的网页地址复制在软件的录入框中就可以自由下载,并最终生成pdf文件。对部分pdf文件能够提取文字生成txt。 豆丁网免费下载器还支持自由下载百度、...
对于"Fish-v321"这个文件,根据上下文推测,这可能是某个特定的在线文档下载神器的版本号或者是该工具的安装包文件名。具体的功能和使用方法,可能需要进一步查阅相关软件的说明书或者进行实际操作来了解。总的来说...
【描述】"文档下载器" 提供了一个集成化的解决方案,让用户能够轻松下载网络上的文档资源,特别是可能存在于各种文档分享平台上的PDF、SWF等格式的文件。它可能包含了用于处理不同文件类型的组件,以及一些支持程序...
需要注意的是,虽然冰点文档下载器可以免费下载这些文档,但下载的文件质量可能与原版有所差异,例如可能存在格式转换后的问题,如图片模糊或排版错乱。因此,在实际使用时,用户需要根据下载后的文件质量来调整自己...
“百度文库”和“豆丁文件免费”则明确了这个工具的主要功能是服务于这两个平台的文档下载。 关于冰点下载,这可能是该工具的具体名称,或者是压缩包中包含的一个主要文件。冰点下载工具可能是一个网页抓取或代理...
ASP.NET中提供可以在页面下载存储在后台的文件,很好用哦
visual studio 2010的帮助文档很难下载,一方面文件很多很大,全部文档超过1GB,使用微软自带的 或者辅助工具,由于没有发挥多线程和断点续传的特点,下载速度很慢,容易失败。 另一方面迅雷等下载工具,可以实现...
国密规范文档所有标准稳当的下载链接,SM2/SM3/SM4/SM9等,各种国密产品检测规范
在提供的压缩包子文件“Fish-v324-0712”中,我们可以推测这可能是冰点文档下载器的一个版本,其中可能包含了软件的执行文件、帮助文档、许可证文件等组成部分。用户在下载这个压缩包后,需要解压并按照指示安装和...
在"link.txt"文件中,很可能是提供了Visual Studio 2012官方离线文档的下载链接。下载后,用户可以通过文件浏览器打开这些.chm文件,通过内置的搜索功能查找所需的信息。同时,开发者还可以结合其他在线资源,如MSDN...
- **标题解析**:“ce下载文件说明”提示了文档的主要内容是关于名为“ce”的软件或资源的下载说明。 - **描述解析**:“ce文件下载说明”进一步确认了该文档是为了指导用户如何正确下载并使用与“ce”相关的文件。 ...