首页互联网content-Disposition(Content-Disposition)

content-Disposition(Content-Disposition)

编程之家2024-02-10108次浏览

一、POST请求的几种content type类型

content-type是http请求的响应头和请求头的字段。当作为响应头时,告诉客户端实际返回的内容的内容类型。作为请求头时(post或者put),客户端告诉服务器实际发送的数据类型。

content-Disposition(Content-Disposition)

在前端开发过程中,通常需要跟后端工程师对接接口的数据格式,不同的数据类型对于服务器来说有不同的处理方式,因此我们需要关注不同的conten-type类型.

1. application/x-www-form-urlencoded

浏览器原生form表单默认的提交方式(在不设置enctype的情况下)。此时请求头的格式如下:

content-Disposition(Content-Disposition)

content-type: application/x-www-form-urlencoded;charset=utf-8

form-data: key1=val1&key2=val2

此时后端例如php可以通过$_POST["key1"]的方法来获取参数值。

content-Disposition(Content-Disposition)

此种情况下:非字母或数字的字符会被进行编码(编码方式 ),这也是为什么这种方式不支持二进制数据的原因。

2. multipart/form-data

与application/x-www-form-urlencoded的区别是她支持文件的传输,并且它的传输数据放在request-payload里,并且以bounday进行分隔。

POST/test.html HTTP/1.1

Host: example.org

Content-Type: multipart/form-data;boundary="boundary"

--boundary

Content-Disposition: form-data; name="field1"

value1

--boundary

Content-Disposition: form-data; name="field2"; filename="example.txt"

value2

3. application/json

格式是这样的:

POST HTTP/1.1

Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]}

它用来告诉服务端消息主体是序列化后的 JSON字符串,其中一个好处就是JSON格式支持比键值对复杂得多的结构化数据。此时php不能直接通过$_POST获取,需要先从php://input里获得原始输入流,再json_decode成对象

4.text/plain

传统的ajax请求提交

function submit2(){

   var xhr= new XMLHttpRequest();

   xhr.timeout= 3000;

   var obj={a: 1, b: 2};

   xhr.open('POST','/');

   xhr.send(obj);

}

另外,对于axios请求,不同的请求方式content-type也不同

function submit3(){

   var sence1='name=123&val=456';

   var sence2={name: 123, val: 456};

   axios.post('/', sence1)

}

1.当传递的是字符串的时候

   

2.当传递的是对象的时候

   

1.传统的ajax请求时候,Content-Type默认为"文本"类型。

2.传统的form提交的时候,Content-Type默认为"Form"类型。

3.axios传递字符串的时候,Content-Type默认为"Form"类型。

4.axios传递对象的时候,Content-Type默认为"JSON"类型

二、怎么使用添加content-disposition

在进行Web开发时,可能遇到遇到以下几种需求:

l

希望某类或者某已知MIME

类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出逗文件下载地对话框。

l

希望客户端下载时以指定文件名显示。

l

希望某文件直接在浏览器上显示而不是弹出文件下载对话框。

对于上面的需求,使用Content-Disposition属性就可以解决。下面是代码示例:

response.setHeader("Content-disposition",

"attachment;filename="

+

fileName)。

//Content-disposition为属性名。

//attachment表示以附件方式下载。如果要在页面中打开,则改为inline。

//filename如果为中文,则会出现乱码。解决办法有两种:

//1、使用fileName

=

new

String(fileName.getBytes(),

"ISO8859-1")语句

//2、使用fileName

=

HttpUtility.UrlEncode(filename,

System.Text.Encoding.UTF8)语句

三、Content-disposition中Attachment和inline的区别

Content-disposition中Attachment和inline的区别如下:

inline对于一些本地装有相应可以打开的软件,并且关联的,浏览器会尝试直接打开查看,不提示下载,attachment则会提示下载,当然也会因不同的浏览器和不同设置而不同

java web中下载文件时,我们一般设置Content-Disposition告诉浏览器下载文件的名称,是否在浏览器中内嵌显示.

Content-disposition: inline; filename=foobar.pdf

表示浏览器内嵌显示一个文件

Content-disposition: attachment; filename=foobar.pdf

表示会下载文件,如火狐浏览器中

spring mvc中

Java代码收藏代码

@ResponseBody

@RequestMapping(value="/download",produces="application/octet-stream")

public byte[] downloadFile(HttpServletRequest request, HttpServletResponse response,String contentType2)

throws IOException{

byte[]bytes=FileUtils.getBytes4File("D:\\Temp\\cc.jpg");

response.addHeader("Content-Disposition","inline;filename=\"a.jpg\"");

return bytes;

}

如上代码中是内嵌显示图片呢?还是会弹框下载呢?

答案是:弹框下载

为什么呢?设置为inline应该是内嵌显示啊!

因为response content type设置成了"application/octet-stream"

注意:我们说是内嵌显示还是下载,那一定是针对可内嵌显示的类型,例如"image/jpeg","image/png"等.

看下面的例子:设置response content type为"image/jpeg"

Java代码收藏代码

@ResponseBody

@RequestMapping(value="/download",produces="image/jpeg")

public byte[] downloadFile(HttpServletRequest request, HttpServletResponse response,String contentType2,String downloadType)

throws IOException{

byte[]bytes=FileUtils.getBytes4File("D:\\Temp\\cc.jpg");

response.addHeader("Content-Disposition", downloadType+";filename=\"a.jpg\"");

return bytes;

}

在浏览器中访问:时就内嵌显示:

android系统签名(Android 系统签名实现的三种方式)提交入口(最全的网站提交入口)