我正在尝试使用AJAX上传文件。这是我第一次使用FormData。
在我的客户端脚本中,我只是遍历$ _FILES并回显每个,只是为了确认它们是被发送的,而它们不是。我也检查了$ _POST数组,但这也是空的。虽然正在调用服务器端脚本,但似乎没有从JavaScript接收任何数据。
这是我的代码,我做错了什么?
JS
var client = new XMLHttpRequest();
function upload(){
var file = document.getElementById("uploadfile");
var formData = new FormData();
formData.append("upload", file.files[0]);
client.open("post", "/orl_ajax_uploader.php", true);
client.setRequestHeader("Content-Type", "multipart/form-data");
client.send(formData);
return false;
}
client.onreadystatechange = function(){
if (client.readyState == 4 && client.status == 200){
alert(client.response);
}
}
HTML
<form action="orl_ftp.php" method="POST" enctype="multipart/form-data" onsubmit="return upload()">
<table>
<tr>
<td>Choose File: </td>
<td><input type="file" name="file" id="uploadfile" multiple /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="Process"></td>
</tr>
</table>
</form>
PHP(仅用于测试)
$str = "POST PARAMS // ";
foreach($_POST as $k=>$v){
$str .= $k."=".$v." :: ";
}
$str .= "FILES PARAMS // ";
foreach($_FILES as $k=>$v){
$str .= $k."=".$v." :: ";
}
$str .= "GET PARAMS // ";
foreach($_GET as $k=>$v){
$str .= $k."=".$v." :: ";
}
$str .= '"'.$_FILES['upload'].'"';
echo $str;
当我点击提交时,PHP每次都会发回这个字符串:POST PARAMS // FILES PARAMS // GET PARAMS // ""
除了尝试调用$_FILES['upload']
之前未定义的索引错误..它应该在那里,但不是.. < / p>
修改
答案 0 :(得分:1)
使用client.setRequestHeader("Content-Type", "multipart/form-data");
设置Content-Type
不应与上传文件/表单数据一起使用。浏览器使用我们不需要担心的请求内部的边界和内容来处理Content-Type
值的生成。不手动设置该请求标头应允许浏览器在请求中正确包含该文件,并使其正确地供服务器使用。
更改后,您应该能够访问$_FILES["upload"]
,这是一个关联的属性数组。如果您需要获取实际内容,请使用file_get_contents($_FILES["upload"]["tmp_name"])
之类的内容,否则您可以获取有关该文件的信息,如名称,类型等。
<强>参考文献:强>