javascript - 使用Ajax上传文件

标签 javascript php jquery ajax

我已经尝试了几种变体(基于文章和其他 SO 论坛)来使其工作,并且我已将范围缩小到当我尝试将表单数据发送到我的 PHP 时数据丢失的事实脚本。当我 echo $_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"];
    }

最佳答案

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

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

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

var fd = new FormData(this);

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

这个answer提供了进一步的解释。

关于javascript - 使用Ajax上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37690924/

相关文章:

javascript - system.js 加载脚本时如何要求 ('electron' )

javascript - jQuery PHP 处理输入数组

jquery - Access-Control-Allow-Origin 不允许来源,但定义了通配符?

javascript - 如何检查文本是否与要求的几乎相同

javascript - Jquery next() 不起作用

javascript - 使用纯 CSS 在响应式容器中垂直居中按钮?

php - 是否可以在类中使用 cURL 回调函数?

javascript - 我们如何在 javascript 函数表中给出选择选项

javascript - 页面加载时默认打开 bs-select (Angular-strap) 下拉列表

php - 如何找到数组中的最小数字并返回该数组的主索引?