关于文件下载的几个问题总结

类别:Java 点击:0 评论:0 推荐:
 

关于文件下载的几个问题总结

 

使用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" );

需要说明的有三点:

Ø         中文文件名需要进行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的性能,尽量少用 

 

本文地址:http://com.8s8s.com/it/it16156.htm