表单中<form>的enctype属性

application/x-www-form-urlencoded、multipart/form-data、text/plain


上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上传表单要这么
写,知其然而不知其所以然。那到底为什么要添加这个属性呢?它是什么意思呢?它又有什么其他可选值呢?
其实form表单在你不写enctype属性时,也默认为其添加了enctype属性值,默认值是enctype="application/x-
www-form-urlencoded".这个属性管理的是表单的MIME编码,共有三个值可选:

  ①application/x-www-form-urlencoded
(默认值)

  ②multipart/form-data

  ③text/plain

  其中①application/x-www-form-urlencoded是默认值,大家可能在AJAX里见过这
个:xmlHttp.setRequestHeader("Content-Type","application/x-www-form- urlencoded");
这两个要做的是同一件事情,就是设置表单传输的编码。在AJAX里不写有可能会报错,但是在HTML的form表单里是可以不写
enctype="application/x-www-form-urlencoded"的,因为默认HTML表单就是这种传输编码类型。而
②multipart-form-data是用来指定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或者mp3等等。
③text/plain是纯文本传输的意思,在发送邮件时要设置这种编码类型,否则会出现接收时编码混乱的问题,网络上经常拿text/plain和
text/html做比较,其实这两个很好区分,前者用来传输纯文本文件,后者则是传递html代码的编码类型,在发送头文件时才用得上。①和③都不能用
于上传文件,只有multipart/form-data才能完整的传递文件数据。

  上面提到的MIME,它的英文全称是"Multipurpose
Internet Mail Extensions" 多功能Internet
邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉
浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将
MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

  简单说,MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

  浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某
插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机
系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。

    
检查一个服务器是否正确设置了MIME类型的步骤是:

  1.
在Netscape浏览器中打开服务器网页

  2. 进入"View"菜单,选择"Page
Info"

  3. 在弹出的窗口中点击上层框架中的"EMBED"

  4.
在下层框架中查看MIME的类型是否为"application/x-director"或"application/x-shockwave-
flash",如果是上述信息的话表明服务器已经正确设置了MIME类型;而如果MIME类型列出的是文本内容、八位一组的数据或是其它形式均表明服务器
的MIME类型没有设置正确。

  如果服务器没有正确标明其发送的数据的类型,服务器管理员应该正确添加相关信息,具体操作方法非常简单快捷。

  每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

  常见的MIME类型

  
  超文本标记语言文本
.html,.html text/html

    普通文本 .txt
text/plain

    RTF文本 .rtf
application/rtf

    GIF图形 .gif
image/gif

    JPEG图形 .jpeg,.jpg
image/jpeg

    au声音文件 .au
audio/basic

    MIDI音乐文件 mid,.midi
audio/midi,audio/x-midi

    RealAudio音乐文件 .ra, .ram
audio/x-pn-realaudio

    MPEG文件 .mpg,.mpeg
video/mpeg

    AVI文件 .avi
video/x-msvideo

    GZIP文件 .gz
application/x-gzip

    TAR文件 .tar
application/x-tar

    Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用
的MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的
很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的
处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的
MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。
----------------------------------------------------------------
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,
这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
enctype="multipart/form-data"是上传二进制数据;
form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,
所以request就得不到值了。也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:

SmartUpload
su = new
SmartUpload();//新建一个SmartUpload对象

su.getRequest().getParameterValues();取数组值

su.getRequest().getParameter(
);取单个参数单个值

ajax中的application/x-www-form-urlencoded中的使用


一,HTTP上传的基本知识

在Form元素的语法中,EncType表明提交数据的格式
用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。下边是说明: application/x-www-form-urlencoded:
窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
补充
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application
/x-www-form-urlencoded。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&
amp; amp;name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。

如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。但是如果有
type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上
Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件
name)等信息,并加上分割符(boundary)。

二,使用中需要注意的地方

在AJAX往服务器上传数据是,设置了content-type为application/x-www-form-urlencoded,此时是对整个发
送内容作了编码,并不是对名字对应的值做了编码。因此,在服务器端,通过request.getParameter("name")的方式取值,是有问题 的。

有两种解法办法:

1)改服务器端: 采用流的方式硬编码

InputStream stream=request.getInputStream();
InputStreamReader isr=new
InputStreamReader(stream);
BufferedReader br=new
BufferedReader(isr);
String
str=br.readLine();   
System.out.println(str);

str=URLDecoder.decode(str,"gb2312");
System.out.println(str);
br.close();

2)改客户端:更改数据发送结构

在往服务器上发数据的时候,使用name=escape(value)的方式组对

此时在服务器代码中,通过request.getParameter("name")获得的数值,就不用编码了

时间: 2024-08-19 02:53:50

表单中<form>的enctype属性的相关文章

form表单标签的enctype属性的作用

Enctype是指定将数据回发到服务器时浏览器使用的编码类型,其编码类型有以下三种 一. application/x-www-form-urlencoded 这是通过表单发送数据时默认的编码类型.我们没有在from标签中设置enctype属性时默认就是application/x-www-form-urlencoded类型的.application/x-www-form-urlencoded编码类型会把表单中发送的数据编码为名称/值对.这是标准的编码格式.当表单的ACTION为POST的时候,浏览

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

Enctype :指定将数据回发到服务器时浏览器使用的编码类型.用于表单里有图片上传. 编码类型有以下三种: application/x-www-form-urlencoded: 在发送前编码所有字符(默认).这是标准的编码格式. multipart/form-data: 不对字符编码,在使用包含文件上传控件的表单时,必须使用该值. text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符. 例子: <form action="${pageContext.reque

表单form的enctype=&quot;multipart/form-data&quot;使用疑惑

在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用request.getParameter()来获取到各个表单元素的值的.可以通用这样(上传组件提供的API): boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) {  // Create a fa

form 表单中input 使用disable属性

记录一下今天踩得坑. 在使用form表单提交的时候,input用了disable属性,在查找了好久之后,找到原因,万万没想到是因为disable. 修改方法:disable改为readonly disable:1.不能接受焦点 2.使用tab键的时候将被跳过 3.可能不是successful readonly:1.可以接收焦点,但不能被修改 2.可以使用tab键进行导航 3.可能是successful的 只有successful的表单元素才是有效数据,即是进行提交后可以获取值.disabled和

表单中Readonly和Disabled的区别

Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,包括select, radio, checkbox, button等. 但是表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,这个元素的值不会被传递出去,而readonly会将该值传递出去(

表单中Readonly和Disabled的区别(转载)

Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,包括select, radio, checkbox, button等. 但是表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,这个元素的值不会被传递出去,而readonly会将该值传递出去(

【转载】表单中 Readonly 和 Disabled 的区别

今天写代码,遇到表单提交的问题,某个字段在不同的情况下,要传递不同的值进行赋值,试过一些方法都有些问题,后来请教前端同学,使用 disabled 这个属性终于搞定了问题,查到一篇讲解 readonly 和 disabled 的区别的文章挺好的,转载如下: Readonly 和 Disabled 是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly 只针对 input(text / password) 和 textarea

HTML超文本标记语言(八)——表单&lt;form&gt;

一.表单<form>标签及其属性 HTML表单用于收集用户输入.基本格式如下: <form> . form elements . </form> 表单元素指不同类型的input元素.复选框.单选按钮.提交按钮等. 1.action属性:定义在提交表单时执行的动作,规定向何处提交表单的地址(URL)(提交页面). 通常,表单会被提交到web服务器上的网页.在如下例子中,指定了某个服务器脚本来处理被提交表单: <form action="action_pag

表单中的readOnly 和disabled

readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,包括select, radio, checkbox, button等. 但是表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,这个元素的值不会被传递出去,而readonly会将该值传递出去(