Php 通过AJAX上传文件会导致大量未定义的索引错误

Php 通过AJAX上传文件会导致大量未定义的索引错误,php,ajax,multipartform-data,microsoft-edge,Php,Ajax,Multipartform Data,Microsoft Edge,我有一个项目,涉及将文档作为PHP表单的一部分上传: function uploadFlight(oForm, cFunction) { // This tries a number of different methods for getting an AJAX object // to ensure cross-browser compatibility. var ajax=gimmeAjax(); if (ajax == null) return;

我有一个项目,涉及将文档作为PHP表单的一部分上传:

function uploadFlight(oForm, cFunction)
{
    // This tries a number of different methods for getting an AJAX object
    // to ensure cross-browser compatibility.
    var ajax=gimmeAjax(); 
    if (ajax == null) return;

    ajax.function=cFunction;
    ajax.oForm=oForm;

    // Disable all inputs
    cItems=oForm.getElementsByTagName('input');
    iItems=cItems.length;
    for (var i = 0; i < iItems; i++)
    {
        cItems[i].disabled=true;
    }

    // ... and selects.
    cItems=oForm.getElementsByTagName('select');
    iItems=cItems.length;
    for (var i = 0; i < iItems; i++)
    {
        cItems[i].disabled=true;
    }

    ajax.onreadystatechange = function()
    {
        // Redacted as not relevant to this question
    }

    var formData = new FormData();

    for (var i = 0; i < oForm.length; i++)
    {
        oElem=oForm.item(i);
        if (oElem.tagName.toLowerCase() == "input" || oElem.tagName.toLowerCase() == "select")
        {
            switch (oElem.name)
            {
                case 'document':
                    formData.append('document', oElem.files[0]);
                    break;
                case 'project':
                case 'flight_direction':
                case 'flight_type':
                    formData.append(oElem.name, oElem.options[oElem.selectedIndex].value);
                    break;
                case 'employee_id[]':
                    formData.append('employee_id[]', oElem.value);
                    break;
                case 'task':
                    if (oElem.submitted == true) formData.append(oElem.name, oElem.value);
                    break;
                default:
                    formData.append(oElem.name, oElem.value);
            }
        }
    }

    ajax.open("POST", "comms_ajax.php?module=flight&ts="+get_epoch(), true);
    ajax.setRequestHeader("Content-type", "multipart/form-data");
    ajax.send(formData);

    return false;
}

更改内容类型标题以设置边界会消除第一个错误,但其他字段都不会通过。有什么想法吗?

不要明确设置内容类型,即删除行

ajax.setRequestHeader("Content-type", "multipart/form-data");

当XMLHttpRequest.prototype.send的参数是FormData对象,并且浏览器自动提供与其使用内容匹配的边界选项时,这是默认值。

BTW,您可以将oElem.options[oElem.selectedIndex].value简化为oElem.value。说Edge支持FormData,所以看起来应该可以。当您打开开发人员工具并查看AJAX请求中发送的内容时,是否显示它正在发送所有这些参数?尝试将console.log调用添加到添加到FormData对象的for循环中,为确保正确找到输入。@Barmar感谢您的输入,我可以在“网络”选项卡中查看参数。我从其他有此问题的人那里得到的要点是,当您使用setRequestHeaders设置多部分/表单数据内容类型时,它不会添加边界参数。添加一个不会更改所使用的边界文本,它仍然会生成自己的边界文本。
ajax.setRequestHeader("Content-type", "multipart/form-data");