$_FILES 为空但 $_POST 有文件数据时的处理

Handle when $_FILES is empty but $_POST has file data

我在这里看了几个答案,他们都使用了 jQuery 的 .ajax() 方法。下面我有一个 vanilla JS 方法,它是我正在使用的精简版本。

       function ajax(options){
            var settings = {
                method : 'POST',
                url : 'endpoint.php',
                data : null,
                done : function(){},
                fail : function(){},
                complete : function(){}
            };

            if(options) for(option in options) settings[option] = options[option];

            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function(){
                if (xhttp.readyState == 4){
                    if(xhttp.status == 200){
                        settings.done(xhttp.responseText);
                    } else {
                        settings.fail(xhttp.responseText);
                    };
                    settings.complete(xhttp.responseText);
                };
            };
            xhttp.open(settings.method, settings.url, true);
            xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
            xhttp.send(settings.data);
        };

接下来是将文件分配给新 FormData() 对象的函数。

        function beginUpload(index){
            var file = files.files[index];
            var pkg = new FormData();
            pkg.append('file', file);
            pkg.append('size', file.size);
            ajax({
                data : pkg,
                done : function(res){
                    console.log(res);
                }
            });
        };

现在,问题来了:我找到的所有教程和示例都说请求完成后,将在 $_FILES 全局变量中找到该文件。我收到一个 200 响应,对我来说 var_dump()$_FILES 是空的,但 $_POST 不是。 $_POST 里面有看起来像文件的东西。检查了所有 php.ini 设置 from this question

xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

不要设置那个。 XHR 将识别 FormData 对象并将其设置为正确的值(实际上不是)。