form上传表单enctype属性编码值_俟河之清的博客-程序员信息网_form enctype=

技术标签: html  browser DOM  

       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")获得的数值,就不用编码了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21653855/article/details/103127906

智能推荐

Activiti 指定节点跳转(适合退回、撤回)流程_清河木子的博客-程序员信息网_activityimpl activityimpl = definitionentity.finda

转载并重新整理下代码。//方法一,画退回的路线,设置退回的条件值//方法二,退回到指定环节@RequestMapping("/rollBackToAssgin.do")public void rollBackToAssignWoekFlow(@RequestParam("processInstanceId") String processInstanceId, String destTaskkey) { // 取得当前任务.当前任务节点 destTaskkey = .

oracle 11G新特性延迟段deferred_segment_creation_欣欣闹天下的博客-程序员信息网

CREATE TABLE "DBMT"."JUSTFORTEST2" ( "TEST1" VARCHAR2(2) ) TABLESPACE DATA123; SQL> @p deferred_segment_creation;NAME VALUE---------------------------------------- -------------------...

linux apache mysql java_在linux下进行搭建jdk,mysql,Tomcat,禅道_半杯木的博客-程序员信息网

搭建jdk1.查看当前Linux系统是否已经安装javarpm -qa | grep java2.卸载CentOS自带的jdkrpm -e --nodeps要卸载的软件3.下载jdk.tar4.上传jdk到linux5.解压jdk到/usr/local下tar –xvf jdk-7u71-linux-i586.tar.gz –C /usr/local6.配置jdk环境变量,打开profile配置...

USDT(omni)转账教程_ethtronusdt的博客-程序员信息网_ustd怎么转账

USDT(omni)是架设在btc网络上面的。ztpay平台 “”USDT “”就是omni。 “”USDTERC20“”是以太坊代币。2个要分清楚。下面讲的是 USDT(omni)。一、手续费地址。1、USDT转账扣的btc作为手续费也就是矿工费。所以要准备一个ztpay平台创建的USDT地址,谨记是USDT地址。往里面充入一定量的btc。作为手续费地址资金池。210f6b714d1fa...

keras报错Exception encountered when calling layer “max_pooling2d...with input shapes: [?,2,2,256]._Fighting社火底子的博客-程序员信息网

Negative dimension size caused by subtracting 3 from 2 for '{{node max_pooling2d_27/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NHWC", explicit_paddings=[], ksize=[1, 3, 3, 1], padding="VALID", strides=[1, 2, 2, 1]](Placeholder)' with input shapes: [?,2,2

一直在用的一篇ctex模板_qq_37119273的博客-程序员信息网_ctex模板

%\documentclass{article}\documentclass{ctexart}\usepackage{CJK}%美国数学学会的三个数学包\usepackage{amssymb,amsfonts,amsmath,amsthm}\usepackage[dvips]{graphicx}\usepackage{overpic}\usepackage{subfigure}%加

随便推点

2021-10-20 基本数据库通用查询(上)_抱羊的博客-程序员信息网

select *from emp;SELECT *FROM dept;一、基础函数1、lower() 转化为全小写select 'ABC' ,lower('ABC');2、upper() 转化为全大写select 'def' ,lower('def');3、length() 获取长度 获取到的是字节数select dname,length(dname) from dept;4、substr() 截取字串 下标从1开始,截取时含头含尾。若超出范围则默认...

Ubuntu 更换国内源_追求卓越583的博客-程序员信息网_linux ubuntu 换国内源

Ubuntu系统自带的源都是国外的网址,国内用户在使用的时候网速比较慢。一个软件的下载是十分痛苦的,这里讲解一下如何将国外源更换为国内源,让你的网速Biu.Biu.Biuc如果想快速切换国内源强烈推荐:>>>> Ubuntu快速更换国内源<<<<<该篇博国内源是16.04,推荐使用:>>>> Ubuntu快速更换...

python-字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)_思无量学无涯的博客-程序员信息网

1、去空格及特殊符号s.strip()s.lstrip()s.rstrip()s.strip().lstrip().rstrip(',')   声明:s为字符串,rm为要删除的字符序列  s.strip(rm)        删除s字符串中开头、结尾处,位于 rm删除序列的字符  s.lstrip(rm)       删除s字符串中开头处,位于 rm删除序列的字符  s..._1671465600

Keras:KeyError:‘Failed to format this callback filepath:{val_loss:.4f}.h5. Reason: \‘val_loss\‘‘_任博啥时候能毕业?的博客-程序员信息网

如果你使用Keras 的ImageDataGenerator来进行图像增强,如下:validataion_generator = validation_datagen.flow_from_directory(validation_dir, target_size=target_size,

【转载】minicom的使用,发送AT指令_wang 恒的博客-程序员信息网_minicom 如何发送

区别   首先需要明确minicom和串口调试助手的区别:   串口调试助手是输入内容到输入框中,按“发送”,内容才会一次性发送出去。   minicom是输入一个字符就自动发送,不能发送字符串。因此使用minicom发送AT,如果输错了一个字符,就只能先把本条命令发送出去,然后重新输入命令。   因此一般情况下minicom是和...

Atmel Studio 7.0 快速上手指南(基于ASF)_xqhrs232的博客-程序员信息网_atmel studio 7 快捷键

原文地址::https://blog.csdn.net/hubinbin595959/article/details/79150027相关文章1、Atmel Studio 7.0 安装说明----https://jingyan.baidu.com/article/93f9803f02e48ce0e46f5535.html2、AVRStudio简易入门教程----https://...

推荐文章

热门文章

相关标签