【问题标题】:Uploading files with XMLHttpRequest使用 XMLHttpRequest 上传文件
【发布时间】:2013-06-12 20:10:56
【问题描述】:

我是 XMLHttpRequest 的新手,我一直将它用作使用 JavaScript 的 FormData() 的 AJAX 文件上传器。

我遇到的问题是它似乎可以正常上传,尽管我认为它没有将其发送到正确的 PHP 文件或者我的 PHP 错误,因为图片应该在的文件夹中没有显示任何内容。

暂时不知道怎么查看返回的html数据

JavaScript:

$("#form").submit(function(event) {

    event.preventDefault();
    event.stopPropagation();

    var form = $(this);
    var file = document.getElementById("file");
    var data = new FormData();

    var onerror = function(event) {
        alert("An error occoured!");
    }
    var onprogressupdate = function(event) {

        if(event.lengthComputable) {

            var percent = event.loaded / event.total * 100;

            $("#progress").html(percent+"%");

        }

    }
    var onreadystatechange = function(event) {

        if(request.status == 200 && request.readyState == 4) {

            alert("Uploaded!");

            $("#progress").hide();
            $("#progress").html("");

        }
        else {
            alert("Alternative state and/or status");
            console.log("state: " + request.state); 
            console.log("readyState: " + request.readyState);
        }

    }

    for(var i = 0; i < file.files.length; i++)
        data.append('file[]', file.files[i]);

    $("#progress").show();
    $("#progress").html("Uploading files...");

    var request = new XMLHttpRequest();

    request.upload.addEventListener("error", onerror);
    request.upload.addEventListener("progress", onprogressupdate);
    request.upload.addEventListener("readystatechange", onreadystatechange);

    request.open("post", "upload.php");
    request.setRequestHeader("Content-type", "multipart/form-data");
    request.send(data);

});

上传页面

<?php

    if(isset($_FILES["file"])) {

        $f = $_FILES["file"];
        $dir = "data";

        if(!file_exists($dir))
            mkdir($dir);

        foreach($f["name"] as $k => $name) {

            $file = $dir."/".$name;

            if($f["error"][$k] == 0 && move_uploaded_file($f["tmp_name"][$k], $file)) {
                $uploaded[] = $file;
            }

        }

        die(json_encode($uploaded));        
    }

?>

【问题讨论】:

  • 你能提供服务器响应(带有萤火虫)吗?

标签: php javascript xmlhttprequest


【解决方案1】:

不要设置内容类型,它会自动设置。

【讨论】:

  • 我删除了它并且有效。也感谢 Jan 的帮助
  • 哇,这是最意想不到的。你能解释一下为什么吗?
  • @JanTuroň 多部分/表单数据内容类型需要边界
【解决方案2】:

使用您要发送的表单元素创建您的 FormData 对象:

var data = new FormData(this);

而不是

var data = new FormData();

FormData 的语法是

新的 FormData(可选的 HTMLFormElement 表单)

没有参数,它是空的,见the reference

【讨论】:

  • OP 使用append 将文件添加到FormData 对象
猜你喜欢
  • 2012-05-15
  • 2011-09-06
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
相关资源
最近更新 更多