为啥没有 enctype 属性文件上传不起作用?

Posted

技术标签:

【中文标题】为啥没有 enctype 属性文件上传不起作用?【英文标题】:Why does file upload not work without the enctype property?为什么没有 enctype 属性文件上传不起作用? 【发布时间】:2010-12-14 07:02:42 【问题描述】:

大多数时候,文件上传错误的根源是我们忘记在 html 表单中添加enctype 属性。

通常,我们不需要为常规请求添加enctype 属性。但是,我们确实需要在上传文件时将其添加到 HTML 表单中,

enctype="multipart/form-data"

我只是好奇,为什么没有enctype 属性就无法上传文件?

【问题讨论】:

【参考方案1】:

“multipart/form-data”编码类型由 RFC 1867 指定,您可以查看 here 以了解更多技术概述。

在 HTML 表单中,数据表示为多个字段。当使用 multipart/form-data 作为 enc 类型时,浏览器将表单字段作为一系列“部分”发送,每个“部分”都有一个内容类型标题来描述存储在部分中的数据类型。对于普通表单字段,此内容类型通常设置为“text/plain”。该内容类型仅在使用 multipart/form-data 编码类型时由浏览器发送。

对于“文件”类型的输入元素,内容类型是“应用程序/八位字节流”或类似的东西,这向服务器端软件表明该字段的内容不是典型的纯文本,而是一个文件,应该以不同的方式处理。

“文件”类型的输入元素在不使用“multipart/form-data”时不起作用的原因是服务器无法识别该字段的内容与普通文本字段(因为浏览器不发送内容类型,除非使用 multipart/form-data),因此它将字段的内容作为普通文本处理。当使用正确的enctype并且服务器可以正确识别字段包含什么类型的数据时,服务器知道将字段的内容作为文件数据而不是文本来处理并且可以正确处理。

【讨论】:

【参考方案2】:

您可能想在这里查看 cmets: http://www.velocityreviews.com/forums/t137597-html-file-upload-using-enctype-multipart-form-data-in-form.html

简而言之,enctype 告诉浏览器如何发送文件。如果没有正确的编码类型,它将无法发送文件。

【讨论】:

以上是关于为啥没有 enctype 属性文件上传不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

PHPMailer文件上传不起作用

Form表单标签的Enctype属性的作用及应用示例介绍

php:使用“enctype =“multipart/form-data””的文件加载不起作用

vue.config.js的proxy为啥不起作用

为啥动态组件创建中的属性绑定不起作用?

为什么上传文件的表单里面要加一个属性ENCTYPE=MULTIPART/FORM-DATA?