在web开发中有MIME类型一说,它设计的最初目的是为了在发送电子邮件时附加多媒体数据的,让邮件客户程序能根据期类型进行处理(MIME意为多目Internet邮件扩展)。
常见的MIME类型
超文本标记语言文本 .html, .html text/html
普通文本 .txt txt/plain
JPEG图形 .ipeg, .jpeg image/jpeg
GIF图形 .gif image/gif
RTF文本 .rtf application/rtf
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
au声音文件 .au audio/basic
MIDI音乐文件 .mid, .midi audio/midi, audio/x-midi
Word文档 .doc application/msword
Excel文档 .xls application/vnd.ms-excel
TAR文件 .tar application/x-tar
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
MPEG文件 .mpg, .mpeg video/mpeg
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
这些定义使浏览器能够首先尝试打开操作,但操作不成功就提示下载对话框,要想浏览器一定能弹出对话框,可以对response设置一个浏览器永远也不认识的MIME类型,其实也有更好的方法。
在响应头中设置Content-disposition属性,如:response.setHeader("Content-disposition", "attachment;filename=x.txt"); 该方法不但可以使浏览器弹出下载对话框,而且还可以指定默认的文件名,比要设置不认识的MIME类型要好的多。如果确定下载的文件类型,最好还是设置一下MIME类型,content-disposition响应头已经打开下载的对话框了,MIME类型就很容易的提示下载保存的文件类型。
使用Servlet做文件下载例子就很方便了
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = request.getParameter("file");
response.setHeader("Content-disposition", "attachment;filename="+fileName);
BufferedInputStream buffInputStr = new BufferedInputStream(new FileInputStream(fileName));
BufferedOutputStream buffOutputStr = new BufferedOutputStream(response.getOutputStream());
int length = -1;
byte[] b = new byte[1024];
while ((length=buffInputStr.read(b))!=-1) {
buffOutputStr.write(b, 0, length);
}
buffOutputStr.flush();
buffInputStr.close();
buffOutputStr.close();
}
还有一种
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/x-msdownload");
response.addHeader("Content-Disposition", "attachment;filename=lyc.txt");
ServletOutputStream sos =response.getOutputStream();
sos.write("Hello Word! Hello China! I Love You!".getBytes());
sos.close();
}