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

时间:2016-04-29 14:02:01

标签: javascript php ajax file form-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

1 个答案:

答案 0 :(得分:1)

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

不要这样做。 XHR将识别FormData对象并将其设置为正确的值(不是这样)。