header中Content-Disposition的作用

在servlet3.0中 支持文件上传的注解@MultipartConfig 发现有个例子开头打印的信息中有Content-Disposition,一时好奇,所以了解了一下。顺便学习一下文件上传所需要的注意事项。

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)

服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");

备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下:

content-disposition = “Content-Disposition” “:”

disposition-type *( “;” disposition-parm )

disposition-type = “attachment” | disp-extension-token

disposition-parm = filename-parm | disp-extension-parm

filename-parm = “filename” “=” quoted-string

disp-extension-token = token

disp-extension-parm = token “=” ( token | quoted-string )

那么由上可知具体的例子:

Content-Disposition: attachment; filename=“filename.xls”

当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个”文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 了。

注意事项:

1.当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader("Content-Disposition","attachment");一定要确保没有做过关于禁止浏览器缓存的操作。如下:

response.setHeader("Pragma", "No-cache"); 
response.setHeader("Cache-Control", "No-cache"); 
response.setDateHeader("Expires", 0);

不然会发现下载功能在operafirefox里面好好的没问题,在IE下面就是不行,就是找不到文件。

例子:

protected void doPost(HttpServletRequest req, HttpServletResponse response)
            throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        Part part = req.getPart("upload");
        // 格式如:form-data; name="upload"; filename="YNote.exe"
        String disposition = part.getHeader("content-disposition");
        System.out.println(disposition);
        String fileName = disposition.substring(disposition.lastIndexOf("=") + 2, disposition.length() - 1);
        String fileType = part.getContentType();
        long fileSize = part.getSize();
        System.out.println("fileName: " + fileName);
        System.out.println("fileType: " + fileType);
        System.out.println("fileSize: " + fileSize);
        //路径必须先创建在根目录下面/upload
        String uploadPath = req.getServletContext().getRealPath("/upload");
        System.out.println("uploadPath" + uploadPath);
        part.write(uploadPath + File.separator + fileName);
    }

打印部分的

form-data; name="upload"; filename="clipboard.png"
fileName: clipboard.png
fileType: image/png
fileSize: 39917
uploadPathD:\InstallSoft\tomcat\apache-tomcat-7.0.65\wtpwebapps\testweb\upload

时间: 2024-08-10 02:11:12

header中Content-Disposition的作用的相关文章

jQuey中的return false作用是什么

jQuey中的return false作用是什么:在众多的语句中都有return false的使用,当然对于熟悉它的开发者来说,当然是知根知底,知道此语句的作用,当然也就知道在什么时候使用此语句,不过对于初学者可能未必掌握的很清晰明了,下面通过实例介绍一下return false语句的作用.return语句的作用一般是返回函数值,并不再执行下面的语句,直接跳到函数调用的地方,另外还有一个重要的作用,那就是取消默认事件行为的发生.代码实例如下: <!DOCTYPE html> <html&

jQuey中的return false作用是什么?

jQuey中的return false作用是什么?在众多的语句中都有return false的使用,当然对于熟悉它的开发者来说,当然是知根知底,知道此语句的作用,当然也就知道在什么时候使用此语句,不过对于初学者可能未必掌握的很清晰明了,下面通过实例介绍一下return false语句的作用.return语句的作用一般是返回函数值,并不再执行下面的语句,直接跳到函数调用的地方,另外还有一个重要的作用,那就是取消默认事件行为的发生.代码实例如下: ? 1 2 3 4 5 6 7 8 9 10 11

struts2输入校验(附ActionName-validate.xml文件中正则表达式不起作用的解决方案),PS:有点问题希望知道的人指点下

PS:最后附上遇到的疑惑,希望知道的人指点下 前台页面(附代码): <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or

正则表达式中模式修正符作用详解(i、g、m、s、x、e)

正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或aBC或ABc等匹配; //修正符:g表示全局匹配 //修正符:m 将字符串视为多行,不管是那行都能匹配; 例://模式为:$mode="/abc/m";          //要匹配的字符串为:$str="bcefg5e\nabcdfe"              //

http协议中connection头的作用

在http1.1中request和reponse header中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理.   在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close:如果server方 也不想支持长链接,则在response中也需要明确说明connection的值为clos

FAQ: Python中if __name__ == &#39;__main__&#39;:作用

#hello.pydef sayHello(): str="hello" print(str); if __name__ == "__main__": print ('This is main of module "hello.py"') sayHello() python作为一种脚本语言,我们用python写的各个module都可以包含以上那么一个类似c中的main函数,只不过python中的这种__main__与c中有一些区别,主要体现在:

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; /***second***/susecond_t tv_usec;/***microsecond***/}到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000

iOS中关于字符 “&amp;”的作用?

如NSFileManager中关于判断是否目录的 iOS中关于字符 "&"的作用? >> ios 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/ios/1010000008969096/iOS中关于字符amp的作用.html

C++中减去‘0’的作用( -&#39;0&#39; )

我们在日常研(chao)究(xi)大佬们的代码时,可能会遇到减去字符'0'的情况,比如下图,这种语法问题吧说简单它不那么简单,毕竟不好理解:但说难吧也不难,其实就是让代码更简洁更有逼格的途径而已. 说了那么多屁话那么这个减去零到底是干啥的呢? 它的作用就是减去0的ASCII值:48.可以方便的用来转换大小写或者数字和和字符.比如我们可以写这么一个函数: #include <cstdio> #include <iostream> using namespace std; int ch

浅析python 中__name__ = &#39;__main__&#39; 的作用

很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. __name__ 是当前模块名,当模块