我正在向我的后端发送自定义标题:
var oXhr = new XMLHttpRequest;
oXhr.setRequestHeader("X-File-Name", fileName);
但如果fileName
包含重音例如,我得到:
SyntaxError:无法在'XMLHttpRequest'上执行'setRequestHeader': 'é - 2015年12月3日.pdf'不是有效的HTTP标头字段值。
我很难理解doc ...
修改
我意识到即使它确实看起来像一个口音,它也有所不同。这是角色:
它表现得很奇怪(ascii代码769),它混淆了我的浏览器控制台甚至phpStorm。无论如何,即使粘贴(尝试),它也会出现在下一个角色的顶层上。问题是此标头值的内容是用户从文件选择器中选择的文件名,并且此文件名包含此字符。过滤此类事件的最佳方法是什么?
答案 0 :(得分:2)
只应使用RFC7230 - 3.2.4. Field Parsing中指定的US-ASCII:
历史上,HTTP允许字段内容包含文本 ISO-8859-1 charset [ISO-8859-1],仅支持其他字符集 通过使用[RFC2047]编码。在实践中,大多数HTTP标头 字段值仅使用US-ASCII字符集[USASCII]的子集。 新定义的标题字段应该将其字段值限制为 US-ASCII八位字节。收件人应该在字段中处理其他八位字节 内容(obs-text)为不透明数据。
如果您尝试某些不受支持的字符
oXhr.setRequestHeader("X-File-Name", "Φ");
然后你得到
Uncaught DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest':
'Φ' is not a valid HTTP header field value.
关键是规范所说的
...仅通过使用[RFC2047]编码支持其他字符集。
所以你需要像这样编码'Φ'这个
oXhr.setRequestHeader("X-File-Name", "=?UTF-8?Q?=CE=A6?=");
在您的情况下,您需要使用strutil或其他库在发送之前对filename
进行编码。
或者只是从文件名中删除任何不可打印的US-ASCII字符
filename.replace(/[^\x20-\x7E]+/g, '')