【问题标题】:Using Ajax to upload file使用 Ajax 上传文件
【发布时间】:2016-06-07 23:14:19
【问题描述】:

我已经尝试了几种变体(基于文章和其他 SO 论坛)以使其正常工作,并且我已将其范围缩小到当我尝试将表单数据发送到我的 PHP 时数据丢失的事实脚本。当我回显 $_FILES["file"]["name"] 它是空的。

我已经测试并且我的 ajax 和 php 脚本已连接,因为我可以返回一些数据,但不能返回任何表单数据。这显然导致文件没有被上传。

我当前的代码参考了这个论坛(lee8oi 的回答): jQuery Ajax File Upload 我创建了一个新论坛,因为这个问题是 6 年前提出的。

html:

<form id="signUpForm" name="signUpForm"  action="../functions/newUser.php" method="post">
    <input type="file" class="su_photo" name="file" id="user-photo">
    <input type="submit" id="sign-up" type="button" class="btn btn-primary btn-sm pull-right" value="Get Started">
</form>

js:

  $('#signUpForm').on('submit',function(){
        var fd = new FormData( $('#signUpForm') );
        fd.append("label", "WEBUPLOAD");
        $.ajax({
          url: "../../functions/newUser.php",
          type: "POST",
          data: fd,
          processData: false,  // tell jQuery not to process the data
          contentType: false   // tell jQuery not to set contentType
        }).done(function( data ) {
            console.log("PHP Output:");
            console.log( data );
        });
        return false;
    });

php:

   if ($_POST["label"]) {
      $label = $_POST["label"];
    }
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 200000)
    && in_array($extension, $allowedExts)) {
        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
        } else {
            $filename = $label.$_FILES["file"]["name"];
            echo "Upload: " . $_FILES["file"]["name"] . "<br>";
            echo "Type: " . $_FILES["file"]["type"] . "<br>";
            echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
            echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

            if (file_exists("uploads/" . $filename)) {
                echo $filename . " already exists. ";
            } else {
                move_uploaded_file($_FILES["file"]["tmp_name"],
                "uploads/" . $filename);
                echo "Stored in: " . "uploads/" . $filename;
            }
        }
    } else {
        echo $_FILES["file"]["name"];
    }

【问题讨论】:

    标签: javascript php jquery ajax


    【解决方案1】:

    我认为您只需要更改以下行

    var fd = new FormData( $('#signUpForm') );
    

    var fd = new FormData( $('#signUpForm')[0] );
    

    var fd = new FormData(this);
    

    FormData 的构造函数需要一个原生表单元素,而不是 jQuery 对象。所以document.getElementById('signUpForm')$('#signUpForm')[0]this 都可以工作。

    answer 提供了进一步的解释。

    【讨论】:

    • 好答案,我赞成,因为比我的好。你搞定了。 ;)
    猜你喜欢
    • 2013-08-08
    • 2017-09-20
    • 2010-10-04
    • 2016-05-14
    • 2012-05-15
    • 2010-12-31
    • 2013-08-28
    • 2011-09-06
    相关资源
    最近更新 更多