【问题标题】:AJAX not posting FormDataAJAX 不发布 FormData
【发布时间】:2014-03-03 20:48:01
【问题描述】:

我正在尝试使用 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>&nbsp;</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'] 的未定义索引错误......应该在那里,但不是......

编辑

【问题讨论】:

  • 您是否检查过浏览器控制台是否有警告,或监控网络流量以确保正确创建/发送请求?您确定您使用的浏览器支持FormData 和/或XMLHttpRequest2
  • 我不知道它会如何伤害它,但我发现的例子不像你那样使用client.setRequestHeader("Content-Type", "multipart/form-data");。试着把它拿出来试试?
  • @Ian 是的,是的,是的。请参阅我添加的屏幕截图。你觉得那里有什么问题吗?
  • 这有帮助!我不知道为什么,但我现在得到的是“Array”而不是“”!哇!如果你把它放在答案中,我会选择它!谢谢!`

标签: javascript php html ajax multipartform-data


【解决方案1】:

使用client.setRequestHeader("Content-Type", "multipart/form-data"); 设置Content-Type 不应与上传文件/表单数据一起使用。浏览器处理 Content-Type 值的生成,使用边界和我们不需要担心的请求内部的东西。不手动设置该请求标头应该允许浏览器正确地将文件包含在请求中并使其正确地可供服务器使用。

一旦更改,您应该能够访问$_FILES["upload"],这是一个关联的属性数组。如果您需要获取实际内容,请使用file_get_contents($_FILES["upload"]["tmp_name"]) 之类的内容,否则您可以获得有关文件的信息,例如文件名、类型等。


参考资料:

【讨论】:

  • 谢谢你,额外的信息真的帮助我理解了这个问题
  • @Adelphia 没问题!为了更好地理解它,我对其进行了很多研究,所以希望你们可以一起工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2014-11-27
  • 2021-04-14
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多