我是靠谱客的博主 呆萌玫瑰,最近开发中收集的这篇文章主要介绍form-data/x-www-form-urlencoded/raw/binary,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

form-data

http请求中的multipart/form-data,他会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件的时候,会有Content-type表示文件类型;
不对字符编码!有boundary隔离,所以multipart/form-data 既可以上传文件,可以上传键值对。

这里写图片描述


那么到底什么是多部分媒体类型?
MIME中的 multipart 表示报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分是独立的,有各自的描述其内容的集;
不同部分之间用分界字符串连接在一起boundary~

多部分表格提交
当提交填写的HTTP表格时,变长的文本字段和上传的对象都作为 多部分主体(multipart Body )里面独立的部分发送,这样在表格就可以填写各种不同类型和长度的值。

HTTP使用Content-Type:multipart/form-data 或者 Content-Type:multipart/mixed这样的首部以及多部分主体来发送这种请求:
Content-Type:multipart/form-data;boundary=[asdasdsd]
boundary就是分割body(主体)中不同部分所用的字符串。

<form action="http://server.com/cgi" enctype="multipart/form-data" method="post">
<p>xxx</p>
<input type="submit" value="Send"></form>

我们的用户代理可能会得到下面这样的数据:

------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="id"

WU_FILE_0
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="name"

Tulips.jpg
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="type"

image/jpeg
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="lastModifiedDate"

Tue Jul 14 2009 13:32:31 GMT+0800 (中国标准时间)
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="size"

161781
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="chunks"

2
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="chunk"

0
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="file"; filename="Tulips.jpg"
Content-Type: application/octet-stream


------WebKitFormBoundaryfyAzqkdimkhorKIo--

x-www-form-urlencoded

而application/x-www=form-urlencoded会将表单的数据转换为键值对,如:

name=java&age=23

这里写图片描述

在Request body中是这样的:

//header
Content-Type:application/x-www-form-urlencoed
//body
name1=valu1&name2=value2

Raw

可以上传任意格式的文本,text json xml html等
不会有任何编码或者Boundary分隔符。

Binary

相当于Content-Type:application/octet-stream
从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。


multipart/form-data 与 x-www-form-urlencoded的区别

前面也说过了
区别:

  • multipart/form-data是有一个内容分割符用于分割请求体中的多个POST内容,也就是分割前面的几个key值对应的内容:这可能是文件也可能是值
  • multipart/form-data最后会转为一条信息,请求body是字符串。
  • 而x-www-form-urlencoded是经过编码的,键值对是分隔开的(将空格转换为”+”符号,特殊字符转换为ASCII HEX值)
  • 还有一个重大的区别,是后台处理这两种类型的request body 是不同的。

对于 application/x-www-form-urlencoded

用这种方式请求,在后台接收的时候。可以直接从req.body获取这些key的值。 因为它是经过编码好的。所以是可以直接像这样来获取

var handle=function(req,res){
    if(req.headers['content-type']==='application/x-www-form-urlencoded'){
        req.body=querystring.parse(req.rawBody);
    }
};

解析一下,req.body现在就是一个对象了,
你可以像 req.body.username req.body.password这样访问获取键值。

对于 multipart/form-data

直接不能像这种方式解析,而要引入formidable模块

exports.uploadFile=function(req,res){
    //console.log(hasBody(req));
    //judging if len over the limit
    var len=req.headers['content-length']?parseInt(req.headers['content-length'],10):null;
    if(len&&len>bytes){
        return res.status(413).end(); //res.writeHead
    }
//shoule save in somewhere
    if(hasBody(req)){
        if(mime(req)==='multipart/form-data'){
            var form=new formidable.IncomingForm();
            form.parse(req,function(err,fields,files){
                req.body=fields;
                req.files=files;
                console.log("parsing..",req.body);
                console.log(req.files);
                return res.json({msg:'sucess',result:0});
            })
        }
    }else{
        console.log('No file uploading..');
        return res.json({msg:'failed',result:1});
    }
}

主要是帮我们找到分隔符,然后分割开每个部分来解析,此时。
files是multipart/form-data中的文件
field是当中的字段。键的值
因为一个multipart/form-data其实可以理解为是fields和files的组合~ 这样分别即系比较好
这里写图片描述

这里我只上传了一个文件,可以发现对于field是一个空对象,因为我们没有键值。
而文件有,这是对文件的解析内容。


multipart/form-data分析:

http协议规定了以ASCII码传输,建立在TCP/IP协议之上,规范把http请求分为3个部分:状态行、请求头、请求体。
实现都是围绕如何运用和组织这三部分来完成的。
http协议本身原始方法不支持这种multipart/form-data请求,它利用post方法组合实现的.
请求头必须包含:Content-Type,值必须为multipart/form-data,同时规定一个内容分割符用于分割请求体中的多个post内容

构造方式不同
multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。

最后

以上就是呆萌玫瑰为你收集整理的form-data/x-www-form-urlencoded/raw/binary的全部内容,希望文章能够帮你解决form-data/x-www-form-urlencoded/raw/binary所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部