在 Internet Explorer 11 中通过 fetch-api 发布 FormData-object 时为空值

Posted

技术标签:

【中文标题】在 Internet Explorer 11 中通过 fetch-api 发布 FormData-object 时为空值【英文标题】:Empty values when posting FormData-object via fetch-api in Internet Explorer 11 【发布时间】:2018-05-15 13:11:06 【问题描述】:

我编写了一个 React 组件,它应该用于我的应用程序中的所有表单。单击某个按钮时,我会进行一些验证,最后我想将表单发布到服务器。 这就是这部分目前的样子:

// get what should be submitted
const formData = new FormData(theForm)); // theForm is the DOM-element

//  post the form-data element
fetch(theForm.action,
    
        credentials: "include", //pass cookies, for authentication
        method: theForm.method,
        headers: 
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            //"Content-Type": "application/x-www-form-urlencoded"
        ,
        body: formData
    )
    .then(res => console.dir(res))
    .catch(reason => console.error(reason));

显示的 sn-p 在Chrome 中工作正常。但是,在IE11 中却不是。 另一方面,当取消注释Content-Type 标头时,它也会中断Chrome

发现 https://***.com/a/46642899/615288 时始终为 "multipart/form-data"。但即使我将其设置为multipart/form-data,这些值也不会发送到服务器。

我正在使用来自 https://github.com/jimmywarting/FormData 和 whatwg-fetch 的 FormData polyfill。

我看不到这里发生了什么,因为 FormData 从版本 9 开始应该可以在 IE 中工作。

旁注:当注释掉整个标题部分时,它仍然可以在Chrome 中工作,因为浏览器似乎猜到了正确的部分(可以在开发者工具中看到)

【问题讨论】:

【参考方案1】:

今天有人在 repo 中向我报告了这件事。

https://github.com/jimmywarting/FormData/issues/44

显然“IE 无法在其正文是类型化 Blob 的 XHR 上设置 Content-Type 标头”,这就是您得到错误内容类型标头的原因。将版本更新到可能 3.0.7 可以解决此问题

【讨论】:

【参考方案2】:

我遇到了这个问题,但经过一番挫折后,我发现在 FormData 对象上附加一个额外的字段突然所有字段都出现在服务器上。

const formData = new FormData(theForm);

// this somehow makes it work
formData.append('fakefield', 'nothing to see here!');

fetch(theForm.action).then(/* do the stuff */);

我不知道它为什么起作用,但在我添加该行之前,服务器收到 作为请求正文,然后它收到 myformfield: 'myvalue', myotherfield: 'myothervalue', fakefield: 'nothing to see here!'

希望这可以为某人节省一点挫败感:)

【讨论】:

您在“theForm”中传递的内容,我面临同样的问题。

以上是关于在 Internet Explorer 11 中通过 fetch-api 发布 FormData-object 时为空值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Internet Explorer 11 降级到 Internet Explorer 10?

Internet Explorer 11 图像像素化

如何在 Internet Explorer 11 中支持 Promise?

无法在 Internet Explorer 11 上运行量角器

Internet Explorer 11 中的光标偏移

占位符 Internet Explorer 11 未显示