PHP 使用 Ajax 发送表单数据时未获得 $_FILES
PHP doesn't get $_FILES when sending form data using Ajax
我正在尝试在我的网站上创建一个上传元素。我想做的是一个上传按钮,当用户从计算机上选择一个文件时,它会立即将其上传到服务器。
这是我的表格:
<form id="createAlert" name="createAlert" enctype="multipart/form-data" method="POST" action="createAlert.php">
<input name="title" type="text" class="input-medium" maxlength="36"></input>
<textarea name="content" rows="7" cols="90" class="input-short" style="font-family: arial; width: 80%; resize: none; height: 250px"></textarea>
<input name="push" type="checkbox"></input>
<input enctype="multipart/form-data" name="img" id="img" size="35" type="file"/>
<input class="submit-gray" type="submit" value="POST ALERT"/>
</form>
这是我的 Javascript 代码,它将文件作为 FormData
对象发送到上传页面 (upload.php
):
$('#img').live('change', function() {
var formData = new FormData();
formData.append('file', $('#img')[0].files[0]);
$.ajax({
url : 'upload.php',
type : 'POST',
data : formData,
enctype: 'multipart/form-data',
success : function(data) {
console.log(data);
alert(data);
},
cache: false,
contentType: false,
processData: false
});
});
到目前为止,一切顺利 - 一切正常。问题在于接收 FormData
的 upload.php
文件。这是它的代码(它只是一个测试版本,它还没有上传文件):
<?php
print file_get_contents('php://input');
var_dump($_FILES);
var_dump($_POST);
问题是 var_dump($_FILES);
和 var_dump($_POST)
的输出是两个空数组,而在 file_get_contents('php://input')
中我得到文件数据。
这是输出(我把上传文件内容的部分剪掉了...):
------WebKitFormBoundaryw4nmFcISqYuAWQOS
Content-Disposition: form-data; name="file"; filename="Sem Título-1.png"
Content-Type: image/png
//Here is the file I uploaded...
------WebKitFormBoundaryw4nmFcISqYuAWQOS--
array(0) {
}
array(0) {
}
我在这里阅读了几十个问题的答案和许多解决问题的方法,但是 none 解决了问题。
我做错了什么?为什么我只在 php://input 中收到文件,而不是使用 $_FILES
?
谢谢!
我建议您更新您正在使用的 jQuery 版本。 live()
已于 5 年前弃用并从源代码中删除,并且 $.ajax()
.
中数据的序列化和编码方式发生了一些变化
您使用的旧版本可能没有这些更新,并且没有以正确的方式将 FormData 添加到请求中。
我正在尝试在我的网站上创建一个上传元素。我想做的是一个上传按钮,当用户从计算机上选择一个文件时,它会立即将其上传到服务器。
这是我的表格:
<form id="createAlert" name="createAlert" enctype="multipart/form-data" method="POST" action="createAlert.php">
<input name="title" type="text" class="input-medium" maxlength="36"></input>
<textarea name="content" rows="7" cols="90" class="input-short" style="font-family: arial; width: 80%; resize: none; height: 250px"></textarea>
<input name="push" type="checkbox"></input>
<input enctype="multipart/form-data" name="img" id="img" size="35" type="file"/>
<input class="submit-gray" type="submit" value="POST ALERT"/>
</form>
这是我的 Javascript 代码,它将文件作为 FormData
对象发送到上传页面 (upload.php
):
$('#img').live('change', function() {
var formData = new FormData();
formData.append('file', $('#img')[0].files[0]);
$.ajax({
url : 'upload.php',
type : 'POST',
data : formData,
enctype: 'multipart/form-data',
success : function(data) {
console.log(data);
alert(data);
},
cache: false,
contentType: false,
processData: false
});
});
到目前为止,一切顺利 - 一切正常。问题在于接收 FormData
的 upload.php
文件。这是它的代码(它只是一个测试版本,它还没有上传文件):
<?php
print file_get_contents('php://input');
var_dump($_FILES);
var_dump($_POST);
问题是 var_dump($_FILES);
和 var_dump($_POST)
的输出是两个空数组,而在 file_get_contents('php://input')
中我得到文件数据。
这是输出(我把上传文件内容的部分剪掉了...):
------WebKitFormBoundaryw4nmFcISqYuAWQOS
Content-Disposition: form-data; name="file"; filename="Sem Título-1.png"
Content-Type: image/png
//Here is the file I uploaded...
------WebKitFormBoundaryw4nmFcISqYuAWQOS--
array(0) {
}
array(0) {
}
我在这里阅读了几十个问题的答案和许多解决问题的方法,但是 none 解决了问题。
我做错了什么?为什么我只在 php://input 中收到文件,而不是使用 $_FILES
?
谢谢!
我建议您更新您正在使用的 jQuery 版本。 live()
已于 5 年前弃用并从源代码中删除,并且 $.ajax()
.
您使用的旧版本可能没有这些更新,并且没有以正确的方式将 FormData 添加到请求中。