2011-03-12 45 views
2

当我在表单中包含文件输入时,表单元素的输入编码出现了问题。我正在使用jquery和一个servlet后端(和ajax调用),但我不知道这应该与它有什么关系。 HTML页面编码设置为UTF-8,并且我还指定了使用utf8的servlet请求的字符编码。当我从表单中删除文件输入时,编码是好的。当包含文件输入在表单中时,编码会被搞乱

当我探讨我看到萤火虫以下有效载荷的请求头:

... 
------WebKitFormBoundaryMxjJWBwBmPLxN623 
Content-Disposition: form-data; name="createActivityTitleInputId" 

æøåæøåæøåæøå 
... 

输入应æøåæøåæøå的内容,我不知道webkitformboundary的东西是什么...?

如果有人能帮我解决这个问题,我将非常感激。

谢谢:)

-----编辑------

所以我做了一个小测试项目,尽量缩小问题的范围。当我不使用ajax发布表单时,一切正常。如果我使用jQuery表单插件提交表单,那么编码失败...

form.ajaxSubmit({ 
     dataType: 'json', 
     data: data, 
     type: 'POST', 
     success: function(response) { 
      successfunction(response); 
     } 
    }); 

任何人都有使用此插件的经验吗?

+0

可能是一个愚蠢的问题,但是你的''enctype'设置为? – 2011-03-12 23:31:20

+0

没关系,我在这里看到'form-data'。 – 2011-03-12 23:33:04

+1

你用什么来解析'multipart/form-data'请求? Apache Commons FileUpload,我猜?这边界的东西只是RFC2388的一部分,对我来说看起来很好。提交的输入明显错误地编码为ISO-8859-1而不是UTF-8。但是不清楚它是否是错误地使用它的客户端(尝试不同的浏览器),或者只是你自己将提取的UTF-8字符打印到某些错误地使用ISO-8859-1的输出中。 – BalusC 2011-03-12 23:52:58

回答

3

当我研究了HEA ders请求我在bugzilla中看到以下有效负载:

你的意思是Firebug?你在看Firebug的Net日志中的'post'选项卡吗?

因为如果是这样,它会查看整个表单提交上传,并尝试将其解码(包括任何上传文件的字节内容)为UTF-8。如果失败,它将回退到区域默认编码,通常是Windows代码页1252(类似于ISO-8859-1),以显示表单提交内容。

这并不改变表单实际提交的方式!这只是Firebug对此的可视化。 Firebug实际上并不知道用什么字符编码来编码表单内容,这只是猜测。通常情况下,表单提交不会传送任何信息让服务器(或Firebug)知道正在使用哪种编码。

因此,如果您提交的表单没有文件上传,或者文件上传的文件内容本身是有效的UTF-8序列(包括任何仅有ASCII的文件),Firebug将显示整个表单提交为UTF -8,并将显示的内容显示为您所期望的字符。另一方面,如果文件的字节顺序不是有效的UTF-8序列(对于任何二进制文件(例如图像)的确很可能),Firebug会尝试将字节解码为UTF-8,失败,并回落到cp1252。

这将给你显示“Ã|øÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÔ,即使实际的服务器将读取作为UTF- 8并获得“æøåæøåæøå”。 Firebug不知道文本表单提交值(它是字符)与文件上传提交内容(它们是字节;它们也可能代表字符)之间的区别,但如果是这样,则不能保证上传的文件将使用相同的编码作为形式)。

我不知道什么webkitformboundary的东西是...?

在MIME multipart/结构中,有一个边界字符串将每个子部分分开。在multipart/form-data每个子部分是一个表单字段。边界字符串总是以换行符开始,然后是--,但是随后有一个任意字符串被选为边界,通常涉及字符的随机序列,不太可能出现在子部分本身的数据中。

边界字符串可以是任何东西,并在Content-Type: multipart/form-data;boundary=参数中指定。 WebKit浏览器始终使用从----WebKitFormBoundary开始的边界字符串。

+0

意味着萤火虫关闭:)当窗体中的文件输入被移除时,萤火虫中的显示工作正常。另外,我不需要上传任何用于编码的文件就可以搞砸了。当文件输入的内容发生变化时,文件上传是通过ajax来完成的。 – 2011-03-13 11:24:50

+0

此外,后端的servlet将接收到编码错误的内容(获取Ã|øåÃ|øåÃ|ø Ã¥Ã|øå) – 2011-03-13 11:27:29

+0

噢,你正在使用“ajaxSubmit”?通常,使用直接AJAX提交文件上传字段是不可能的。查看ajaxSubmit的代码,它只是提交给iframe目标,而不是用AJAX做任何事情。这是一个完全不同的代码路径,当存在一个文件上传字段时会被采用。 (它看起来像是一个错误的代码路径,但这是一个无关的问题。) – bobince 2011-03-13 12:48:57

0

好的...所以我做了一个解决方法。我没有用ajaxsubmit发布表单,而是使用jquery ajax功能,并手动将每个表单元素值添加到ajax请求的数据部分。这似乎解决了这个问题。

$.ajax({ 
     type: 'POST', 
     url: action, 
     data: params, 
     dataType: 'json', 
     success: function(response, textStatus, XMLHttpRequest) { 
      successfunction(response); 
     } 
    }); 
相关问题