再牛逼的梦想也抵不住傻逼似的坚持!   设为首页 - 加入收藏
您的当前位置:小鱼资料库 > 计算机 > 前端 > 正文

multipart/form-data深入解析

来源:网络 编辑:忘情 时间:2023-01-11
multipart/form-data最初由 《RFC 1867: Form-based File Upload in HTML》文档提出。

1867文档简介中说明文件上传作为一种常见的需求,在目前(1995年)的html中的form表单格式中还不支持,因此提出了一种兼容此需求的mime type。

1867文档中也写了为什么要新增一个类型,而不使用旧有的application/x-www-form-urlencoded:因为此类型不适合用于传输大型二进制数据或者包含非ASCII字符的数据。平常我们使用这个类型都是把表单数据使用url编码后传送给后端,二进制文件当然没办法一起编码进去了。所以multipart/form-data就诞生了,专门用于有效的传输文件。

实例分析
下面举几个栗子: 先使用get方法和post方法,但不写enctype,即以默认的application/x-www-form-urlencoded表格数据格式进行表单请求:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
</head>

<body>
使用get请求,使用application/x-www-form-urlencoded请求头
    <form method="get" action="xxx">
        <label for="name">name</label>
        <input type="text" id="name" name="name">
        <label for="file">file</label>
        <input type="file" id="file" name="file" />
        <input type="submit" value="submit" name="submit">
    </form>
    使用post请求,使用application/x-www-form-urlencoded请求头
    <form method="post" action="xxx">
        <label for="name">name</label>
        <input type="text" id="name" name="name">
        <label for="file">file</label>
        <input type="file" id="file" name="file" />
        <input type="submit" value="submit" name="submit">
    </form>
</body>
</html>

可知post方法和get方法都只是把文件名编码进了url中,文件内容无法得到,这也证实了上述文档中的内容,使用application/x-www-form-urlencoded无法实现文件上传。

若使用enctype='multipart/form-data',并分别使用post和get方法提交表单则会得到如下结果:

// 使用get请求,使用multipart/form-data请求头
<form method="get" action="xxx" enctype="multipart/form-data">
    <label for="name">name</label>
    <input type="text" id="name" name="name">
    <label for="file">file</label>
    <input type="file" id="file" name="file" />
    <input type="submit" value="submit" name="submit">
</form>
// 使用post请求,使用application/x-www-form-urlencoded请求头
<form method="post" action="xxx" enctype="multipart/form-data">
    <label for="name">name</label>
    <input type="text" id="name" name="name">
    <label for="file">file</label>
    <input type="file" id="file" name="file" />
    <input type="submit" value="submit" name="submit">
</form>

可知在上传文件中使用get方法是无效的,依然只能得到文件名。而post结合multipart/form-data才能真正将文件内容传入请求体。

看到提交文件的格式使用一长串字符作为boundtry封装线对字段进行分割。这也很符合multipart多个部分的语义,包含了多个部分集,每一部分都包含了一个content-desposition头,其值为form-data,以及一个name属性,其值为表单的字段名,文件输入框还可以使用filename参数指定文件名。content-type非必须属性,其值会根据文件类型进行变化,默认值是text/plain。multipart的每一个part上方是边缘,最后一个part的下方添加一个边缘。

这篇文章主要是讲解multipart/form-data深入解析,希望能帮到你。
标签:

相关文章:

小鱼资料库 www.xiaoyuzl.com

Copyright © 2020-2022 XIAOYUZL. All rights reserved. 冀ICP备2020029262号-2

声明:本站分享的文章、资源等均由网友上传,版权归原作者所有,只用于搜集整理。如有侵权,请您与站长联系,我们将及时处理!

Top