$_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 对象并将其设置为正确的值(实际上不是)。
我在这里看了几个答案,他们都使用了 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 对象并将其设置为正确的值(实际上不是)。