使用 angularjs $http 将内容类型设置为 utf-8

Posted

技术标签:

【中文标题】使用 angularjs $http 将内容类型设置为 utf-8【英文标题】:set content-type to utf-8 with angularjs $http 【发布时间】:2013-12-26 00:42:17 【问题描述】:

我正在将包含文件、文本等的表单上传到 appengine blobstore:

$http(
    method: 'POST',
    url: the_url,
    transformRequest: formDataObject,
    data: event,
    headers: 'Content-Type': undefined
)

请求成功发送并带有以下标头:

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryYeRxOO7y3qHNWd83

当我尝试将内容类型设置为 "multipart/form-data;charset=UTF-8" 时,我失去了边界并在响应中收到错误:Bad content type. Please use multipart.

添加 UTF-8 字符集的正确方法是什么?

【问题讨论】:

【参考方案1】:

根据 RFC 1341:

As stated in the definition of the Content-Transfer-Encoding field, no encoding other than "7bit", "8bit", or "binary" is permitted for entities of type "multipart". The multipart delimiters and header fields are always 7-bit ASCII in any case, and data within the body parts can be encoded on a part-by-part basis, with Content-Transfer-Encoding fields for each appropriate body part.

所以在这种情况下你必须使用Content-Transfer-Encoding 而不是Content-Type

【讨论】:

我很困惑。我正在使用 FormData 追加方法developer.mozilla.org/en-US/docs/Web/API/FormData。我不知道如何/在哪里设置 Content-Transfer-Encoding。也许我需要对我的文本进行 base64 编码。 将标题设置为:headers: 'Content-Transfer-Encoding': 'utf-8' ,而不是您现在拥有的。 with headers: 'Content-Transfer-Encoding': 'utf-8' 我得到: Refused to set unsafe header "Content-Transfer-Encoding" angular.js:6649 (匿名函数) angular.js:6649 q angular.js:203(匿名函数) angular.js:6648 y angular.js:6518 g angular.js:6252 r angular.js:9042 r angular.js:9042(匿名函数) js:9128 g.$eval angular.js:9953 g.$digest angular.js:9809 g.$apply angular.js:10039(匿名函数) angular.js:15394(匿名函数) angular.js:2246 q angular .js:196 Nc.c 嗯。那我没主意了。对不起。 我已将您的问题标记为正确,因为它揭示了一些情况以及我在那里不需要 utf-8 的事实。【参考方案2】:

我的解决方案是什么都不做:

事实证明,使用headers: 'Content-Type': undefined 是正确的。现在一切正常(我只更改了后端)。

问题是 webob 忽略了编码,因此我认为编码是错误的。升级 webob 解决了这个问题。之所以很难检测到,是因为开发服务器默认使用新的 webob,而生产服务器默认使用旧的 webob 版本,因为 app.yaml 中没有指定新版本:

libraries:
- name: webob
  version: "1.2.3"

【讨论】:

【参考方案3】:

必须设置字符集,例如: 内容类型:multipart/form-data;边界=----WebKitFormBoundaryYeRxOO7y3qHNWd83; charset=UTF-8

【讨论】:

以上是关于使用 angularjs $http 将内容类型设置为 utf-8的主要内容,如果未能解决你的问题,请参考以下文章

我如何将web api中的标题内容返回给AngularJS $ http服务

在 AngularJS 中的 $http 请求期间显示微调器 GIF?

困惑:AngularJS $http POST 响应返回索引文件的 HTML 内容

Rest API 生成 PDF byte[] JSON 内容类型,使用 angularJS 在 Web 中查看

通过 AngularJS 中的模型绑定更改 Kendo 图表类型

springmvc中使用文件下载功能