jquery - 在表单中包含文件输入时编码会变得困惑

标签 jquery servlets encoding file-upload

当我在表单中包含文件输入时,我遇到了表单元素输入编码困惑的问题。我正在使用 jquery 和 servlet 后端(和 ajax 调用),但我不明白这应该与它有什么关系。 HTML 页面编码设置为 UTF-8,并且我指定 servlet 请求的字符编码也使用 utf8。当我从表单中删除文件输入时,编码是正确的。

当我调查请求的 header 时,我在 firebug 中看到以下有效负载:

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

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

输入的内容应该是呀呀呀呀呀,不知道webkitformboundary这个东西是什么……?

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

谢谢:)

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

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

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

有人有使用这个插件的经验吗?

最佳答案

When I investigate the headers for the request I see the following payload in bugzilla:

你是说 Firebug 吗?您是否正在查看 Firebug 中网络日志记录中的“发布”选项卡?

因为如果是的话,它所做的就是查看整个表单提交上传,并尝试将其解码(包括任何上传文件的字节内容)为 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 不知道文本表单提交值(字符)和文件上传提交内容(字节)之间的区别;它们也可能代表字符,但如果是这样,则不能保证上传的文件将使用相同的编码作为形式)。

I do not know what the webkitformboundary stuff is...?

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

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

关于jquery - 在表单中包含文件输入时编码会变得困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286282/

相关文章:

cocoa - NSTask字符串编码问题

java - IntelliJ 14 不断将编码切换为 UTF-8

javascript - $(window).hashchange() 不起作用

javascript - 上下滚动不起作用

java - ServletFileUpload.parseRequest() 需要 RequestContext 而不是 HttpServletRequest 请求

java - 设置默认 servlet

xml - 包含以意外字符结束的 XML 书本的 HTTP 响应

javascript - jQuery:同一页面上两个相同表单的提交功能

jquery - 如何获取JSON数据名称

java - java servlet中出现空指针异常