转:http://ltc603.iteye.com/blog/25158
使用servlet来下载文件,其原理非常简单,只要得到文件的输入流(或相应字节),然后写输出流即可。现就其中的几个细节问题展开:
1. MIME类型的设置:
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。
例如EXCEL文件的 MIME 类型是 "application/vnd.ms-excel "。要用servlet 来打开一个 EXCEL 文档,需要将 response 对象中 header 的 contentType 设置成“application/vnd.ms-excel ”。
response.setContentType(contentType);
2. Content disposition
HTTP response header中的content-disposition 允许 servlet 指定文档表示的信息。使用这种header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。
如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。
servlet 中,将 header 设置成下面这样:
response.setHeader("Content-disposition","attachment;filename="+ "Example.xls" );
response.setHeader("Content-Disposition", "inline; filename="fliename)
点击打开会在ie中打开。
需要说明的有三点:
Ø 中文文件名需要进行iso8859-1转码方可正确显示:
fileName = new String(fileName.getBytes("GBK"),"iso8859-1");
Ø 传递的文件名,需要包含后缀名(如果此文件有后缀名),否则丢失文件的属性,而不能自行选择相关程序打开。
Ø 有下载前询问(是打开文件还是保存到计算机)和通过IE浏览器直接选择相关应用程序插件打开两种方式,前者如上代码所示,后者如下:
response.setHeader("Content-disposition","filename="+ "Example.xls" );
3. 在研究文件的上传及下载过程中,有几点体会
程序的I/O操作往往是性能的瓶颈所在,java io定义了两个基本的抽象类:InputStream和OutputStream,对于不同的数据类型比如磁盘,网络又提供了不同的实现,java.io 也提供了一些缓冲流(BufferedStream),使硬盘可以很快的读写一大块的数据, 而Java基本的I/O类一次只能读写一个字节,但缓冲流(BufferedStream)可以一次读写一批数据,,缓冲流(Buffered Stream)大大提高了I/O的性能。所以:
Ø小块小块的读写数据会非常慢,因此,尽量大块的读写数据
Ø使用BufferedInputStream和BufferedOutputStream来批处理数据以提高性能
Ø对象的序列化(serialization)非常影响I/O的性能,尽量少用
注:
1、Servlet中输出流的简单处理方法:
//得到当前web应用根目录下test.txt文件的实际物理路径.
String path = getServletContext().getRealPath("/test.txt");
OutputStream os = response.getOutputStream();
InputStream is = new FileInputStream(path);
byte[] buff = new byte[1024];
int len;
while((len = is.read(buff)) != -1) {
os.write(buff, 0, len);
}
is.close();
os.close();
2、输出流跟PrintWriter out = response.getWriter();不能同时使用。
分享到:
相关推荐
linux命令行,day5几个配置文件和远程telnet,详细笔记文档总结
这个时候先别急着找后端,只要能下载生成想要的文件,文件打开内容是正确的都好说.下面总结几种生成导出的写法: 一. a标签点击下载 let blob = new Blob([res.data], {type: 'application/vnd.ms-excel'}); let link =...
Java中File类对文件的几个常见操作实例总结
从几百份课题申请书中总结出普遍存在的40个问题.doc
正则表达式总结文档正则表达式总结文档正则表达式总结文档正则表达式总结文档正则表达式总结文档
C++的各种文件读写操作总结,点到即可,可以举一反三
《[优化作业教学应注意事项]优化作业教学应注意的几个问题教师个人计划总结》.doc
工作5年J2EE经验文档总结, 文档包括69个J2EE相关文档 Extjs学习笔记 hibernate总结 J2EE经验总结 j2ee学习总结 JAVA经典总结 spring经验总结 struts2标签库总结 Spring_AOP_学习小结 ...等几十个总结大全
几个重要的放缩不等式总结.doc
本文档通过融合两部分数据文件的操作,解释了Microsoft Visual Studio 2010/Microsoft SQL Server 2012的帮助文件(使用Microsoft Help Viewer 1.0或1.1管理)在数据文件迁移时应该注意的问题,内容可能又长又臭,不必...
上次上传了一个PDF的文件,虽然蛮详细的。但是后来又找了一些资料,自己总结了一下,拿出来跟大家分享。感谢那些以前的几个作者
根据给出的文档内容,这是一份总结YOLO系列目标检测算法的面试问题,重点介绍了YOLO v1版本。主要包括以下几个方面: 1. 简要介绍了YOLO算法提出的背景,传统的滑窗检测和区域检测算法的缺院。 2. 阐述了YOLO v1的算法...
关于blackberry资源文件如何换的几个关键点。
二.MATLAB GUI编程中几个有用的程序段 1、 启动 2、 在GUI中使用Axes控件 3、 在GUI中使用Excel表格(Activex控件Microsoft Office Spreedsheet) 4、 为Axes控件设置图片 三.Matlab程序生成可执行的exe文件 四....
完全版状语从句自己总结在几个基础上.ppt
生命周期包括哪几个阶段? 答:7个阶段,分别是:加载、验证、准备、解析、初始化、使用和卸载。 2. java有多少个类加载器?分别的作用是什么?一个Class文件是怎么被加载 到JVM里的,描述一下加载流程。 答:java...
这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为...我主要采用了JXLS和POI的第三方jar包,这是一个文档总结。如果要下载程序,可以去我的下载空间。