在某些版本的 Windows 10 上,通过 Microsoft Edge 更新永久禁用已停用的不支持的 Internet Explorer 11 桌面应用程序。 有关详细信息,请参阅 Internet Explorer 11 桌面应用停用常见问题解答

本文提供了一种解决方法,可解决 Microsoft Edge for Windows 10 版本 1809 中无法正确 XMLHttpRequest 发送包含空文件元素的问题 FormData

原始产品版本: Microsoft Edge,Windows 10
原始 KB 编号: 4490157

XMLHttpRequest 发送 ( jQuery.ajax() ) 方法时,它无法正确发送 FormData 包含 Microsoft Edge 中用于Windows 10 版本 1809的空文件元素的对象。

例如,设置一个仅包含一个文件元素的文件,将所有其他文件元素设置为空白,如以下代码示例所示:

<!DOCTYPE html>
        <script src="https://code.jquery.com/jquery-1.12.4.js"
            integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="
            crossorigin="anonymous"></script>
    </head>
        <form action="/AjaxUploadSample/Home/FileUpload" enctype="multipart/form-data" method="post">
            <input name="files" id="files" type="file" value=""><br>
            <input name="files" id="files" type="file" value=""><br>
            <input name="files" id="files" type="file" value=""><br>
            <button id="btn" type="button">Async Upload</button>
        </form>
        <p id="message" style="white-space:pre;"></p>
        <script>
            $(document).ready(function () {
                $("#btn").on("click", function () {
                    var _form = $(this).closest("form")[0];
                    $.ajax({
                        type: "post",
                        url: _form.action,
                        processData: false,
                        contentType: false,
                        data: new FormData(_form),
                        success: function (data, textStatus, jqXHR) {
                            $("#message").text(data.Message);
        </script>
    </body>
</html>

单击“ 异步上传”时,无法正确识别设置文件。

在 Microsoft Edge 中更改 Windows 10 版本 1809 的FormData实现时,会出现此问题。

若要解决此问题,请在调用 之前 $.ajax() 插入以下代码,并显式跳过空条目。

// Workaround
var _data = new FormData(_form);
if (_data.entries)
    var data = new FormData();
    for (var p of _data)
        if (p[1])
            // p[1] is the value of form entry
            data.append(p[0], p[1]);
    } _data = data;
$.ajax(
    type: 'post',
    url: _form.action,
    processData: false,
    contentType: false,
    data: _data,
    success: function (data, textStatus, jqXHR)
        $('#message').text(data.Message);