`
该用户名已经存在
  • 浏览: 308607 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于文件下载

阅读更多
一、什么是文件下载
首先,什么是文件?
我的理解,对于计算机世界而言,文件是数据存储的基本单位,是计算机硬件存储数据的软件抽象。对于软件层面的数据存储而言,任何表现的数据存储本质上都是文件。
其次,什么是下载?
我的理解,下载是数据传输的方式之一,计算机的数据可以有很多的传输方式,可以通过数据线拷贝到硬盘,可以通过打印机输出到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
1
6
分享到:
评论
1 楼 cuisuqiang 2012-12-31  
总结的很好,却总是有一些无聊的人在踩

相关推荐

    Fish文库文档下载工具

    "Fish文库文档下载工具"的核心功能在于其对多种文档网站的兼容性,能够突破常规的在线预览限制,将文档转化为可本地存储的PDF文件。这样,用户就可以随时随地查阅,无需依赖网络连接,极大地提高了学习和工作的效率...

    在线文档下载器

    在线文档下载器可能使用此库来解析和处理从网站下载的PDF文件,确保用户可以本地存储和阅读这些文档。 “iDocDown.exe”是主程序执行文件,是在线文档下载器的核心部分。它包含了实现下载功能的算法和逻辑,能够...

    ajax实现java文件下载

    6. **新建 文本文档.txt**:这可能是示例中的一个测试文件,用于演示如何通过Ajax进行下载。在实际应用中,这个文件的名称和类型将由用户选择或由业务逻辑决定。 具体实现步骤: 1. **前端**:在JSP文件中,使用...

    收费文档下载方法c.zip

    这些工具能够解析百度文库的页面,抓取文档内容并将其转换成本地文件。使用这类工具时,用户需要复制百度文库文档的网页链接,然后粘贴到工具的输入框内,按照提示进行操作。值得注意的是,这种方法可能受制于网站的...

    不需要会员的文档下载器

    标题 "不需要会员的文档下载器" 暗示了我们讨论的主题是关于一款能够帮助用户免费下载各种在线文档的工具,无需订阅或购买网站的会员服务。这种软件通常适用于那些提供付费阅读或下载服务的平台,例如学术论文库、...

    萝卜头文档下载器1.1

    萝卜头文档下载器是一款Windows端的免费文档下载工具,可以帮助我们下载各种常用文档,降低获取成本!软件下载好后无需安装,就可以直接打开使用。 界面非常的干净整洁,支持下载的范围也非常广泛,支持范文、协议书...

    豆丁网文件下载器

    豆丁网免费下载器(冰点)无需登录也无需积分,只需要将需要下载的文档的网页地址复制在软件的录入框中就可以自由下载,并最终生成pdf文件。对部分pdf文件能够提取文字生成txt。 豆丁网免费下载器还支持自由下载百度、...

    在线文档下载神器

    对于"Fish-v321"这个文件,根据上下文推测,这可能是某个特定的在线文档下载神器的版本号或者是该工具的安装包文件名。具体的功能和使用方法,可能需要进一步查阅相关软件的说明书或者进行实际操作来了解。总的来说...

    豆丁网免费下载工具,可把豆丁网文件下载成pdf文件

    总的来说,豆丁网免费下载工具是为了解决无法直接下载豆丁网文档的问题,它通过将网页转换为PDF格式,使用户能够离线阅读和保存文件。在使用过程中,用户应关注版权问题,合理使用工具,并掌握一定的PDF文件管理技巧...

    文档下载器.zip

    【描述】"文档下载器" 提供了一个集成化的解决方案,让用户能够轻松下载网络上的文档资源,特别是可能存在于各种文档分享平台上的PDF、SWF等格式的文件。它可能包含了用于处理不同文件类型的组件,以及一些支持程序...

    豆丁文档下载破解器

    豆丁文档下载破解器. 豆丁文档下载破解器. 豆丁文档下载破解器.

    文件下载的代码

    ASP.NET中提供可以在页面下载存储在后台的文件,很好用哦

    Visual Studio 2010 帮助文件下载助手

    visual studio 2010的帮助文档很难下载,一方面文件很多很大,全部文档超过1GB,使用微软自带的 或者辅助工具,由于没有发挥多线程和断点续传的特点,下载速度很慢,容易失败。 另一方面迅雷等下载工具,可以实现...

    springboot的实现word文档下载.zip

    通过以上步骤,我们就成功地实现了Spring Boot应用中使用Freemarker动态生成并提供Word文档下载的功能。这个示例展示了Spring Boot的灵活性以及与Freemarker集成的便利性,使得动态生成复杂格式的文档变得更加简单。...

    国密文档下载链接

    国密规范文档所有标准稳当的下载链接,SM2/SM3/SM4/SM9等,各种国密产品检测规范

    冰点文档下载器,支持下载网页百度文档

    在提供的压缩包子文件“Fish-v324-0712”中,我们可以推测这可能是冰点文档下载器的一个版本,其中可能包含了软件的执行文件、帮助文档、许可证文件等组成部分。用户在下载这个压缩包后,需要解压并按照指示安装和...

    暴力文档下载器(可下载百度文库、豆丁网等需积分下载的文档)

    【暴力文档下载器】是一款专为解决在线文档平台如百度文库、豆丁网等需积分下载问题而设计的工具。这款下载器以其独特的“暴力”特性,绕过了平台的限制,使得用户无需消耗积分就能获取所需的文档资源,极大地便利了...

    Visual Studio 2012 官方离线文档 下载地址

    在"link.txt"文件中,很可能是提供了Visual Studio 2012官方离线文档的下载链接。下载后,用户可以通过文件浏览器打开这些.chm文件,通过内置的搜索功能查找所需的信息。同时,开发者还可以结合其他在线资源,如MSDN...

    android下载word文档并打开

    在Android平台上,开发一个应用程序以实现下载Word文档并顺利打开是一项常见的需求。下面将详细讲解这一过程中的关键知识点,以及如何结合给定的资源进行操作。 1. **Android权限管理**: 在Android中,访问网络和...

Global site tag (gtag.js) - Google Analytics