我使用 JavaScript 创建了一个简单的文件上传到我的服务器。
它有效,但对于一些 jpeg/png 文件,我收到空的 $_FILES
和 $_POST
变量。
我尝试了很多方法,但没有找到解决方案。
我的 HTML 是这样的:
<input type="file" name="fileUpload" id="fileUpload" multiple="true" onchange="upload(this.files,0);">
JS函数:
upload = function(files,aid){
$.each(files,function(i,file){
if(file.type.match(/image.jpeg/) || file.type.match(/image.png/) ){
if(file.size < 10*1024*1024){
var intreval = setInterval(function(){
if(xhrCheck == false){
xhrCheck = true;
var formData = new FormData();
formData.append("file",file);
formData.append("aid",aid);
function success(data){console.log("success!");};
setTimeout(function(){
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
percentComplete = parseInt(percentComplete * 100);
console.log(percentComplete);
if (percentComplete === 100) {
xhrCheck = false;
clearInterval(intreval);
}
}
}, false);
return xhr;
},
type : "POST",
url : "/photo_uploader.php",
data : formData,
dataType : "JSON",
cache: false,
contentType: false,
processData: false,
success : success,
})
},1000);
}
},1);
}
else {
alert("more than 10mb!");
}
}
else {
alert("only JPEG or PNG allowed!");
}
});
};
在 PHP 中,我只是简单地显示 $_POST
和 $_FILES
变量,如下所示:
pinrt_r($_FILES);
print_r($_POST);
在正常情况下,a 会收到这样的东西:
Array
(
[file] => Array
(
[name] => _DSC0004.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phppUJNS5
[error] => 0
[size] => 5185226
)
)
Array
(
[aid] => 0
)
但是当我选择其他一些照片(不是全部!)时,我收到了这个:
Array
(
)
Array
(
)
但是如果我修改这张图片(比如调整大小),它通常会上传到服务器。
我尝试使用 XMLHttpRequest
并将 Ajax 请求替换为此:
var xmlRq = new XMLHttpRequest();
xmlRq.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total; percentComplete = parseInt(percentComplete * 100);
console.log(percentComplete);
if (percentComplete === 100) {
xhrCheck = false;
clearInterval(intreval);
}
}
}, false);
xmlRq.onreadystatechange = function () {
if (this.readyState == 4) {
if(this.status == 200) {
console.log(this.response);
}
}
};
xmlRq.open('POST', '/photo_uploader.php');
console.log(formData.getAll('file'));
xmlRq.send(formData);
使用这段代码我遇到了同样的问题。
在 FireBug 中我可以看到 POST 数据,它总是有数据要发送。
我不明白为什么有时我会收到空的 $_FILES
和 $_POST
以及我的错误所在。
感谢您的宝贵时间和帮助。
最佳答案
尝试增加 upload_max_filesize 和 post_max_size。 您可以从 php.ini 文件更改这些值。
关于使用 FormData 的 javascript 文件上传问题,收到空的 $_FILES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32819658/