通过Ajax上传img时如何发送文件信息

时间:2019-05-03 19:45:37

标签: javascript php jquery image file

我正在尝试拆分上传到ajax方法的图像文件。所有的html和JS都在一个文件中,然后我组成了一个包含所有PHP的PHP文件。

我正在苦苦挣扎的是我不确定如何将图像文件信息发送到php文件,然后如何使其余的php照常工作。

到目前为止,这行代码$p_img = $_POST['file'];收到未定义的索引错误。但是,即使正在填充该文件,我也不确定这是否适用于要分离的文件。

无论如何,我是否可以将第一个PHP函数UploadFile与HTML和JS一起保留在文件中,然后将该函数发送到PHP文件中?

如果没有,我该怎么办?

HTML

<form action="" method="POST" id="projectForm" enctype="multipart/form-data">
    <label>Project Name</label>
    <input type="text" class="input block" name="p_name">
    <label>Project Img</label>
    <input type="file" id="file" name="file" class="file-input block">
    <button id="submit">Submit Project</button>
</form>

JS

$('#projectForm').validate({
        ignore: [],
        rules: {
            p_name: {
                required: true,
                minlength: 5
            },
            p_alt: {
                required: true,
                minlength: 2
            }
        },
        messages: {
            p_name: {
                required: "Please enter the project name",
                minlength: "The project name is too short"
            },
            p_alt: {
                required: "Please enter the alt text",
                minlength: "Your alt text is too short"
            }
        },
        submitHandler: function (form, e) {
            e.preventDefault();
            var formData = new FormData(form);
            category = $(this).data('category');

            console.log(category);

            $.ajax({
                url: '/php/projectSend.php',
                type: 'POST',
                data: formData,
                success: function (data) {
                  console.log(data);
                },
                contentType: false,
                processData: false,
                error: function (xhr, textStatus, errorThrown) {
                    alert(textStatus + " | " + errorThrown);
                    alert('There are currently no project images for this selection');
                }
            });
        }
    });

PHP

ini_set('display_errors', 1);
error_reporting(E_ALL);
include($_SERVER['DOCUMENT_ROOT'].'/config.php');

$p_name = trim(htmlspecialchars($_POST['p_name'], ENT_QUOTES));
$p_img = $_POST['file'];
$p_alt = trim(htmlspecialchars($_POST['p_alt']));
$category = trim(htmlspecialchars($_POST['categoryName']));
$creator = trim(htmlspecialchars($_POST['creatorName']));
$status = $_POST['status'];

    function UploadFile($fileArray = array(), $destinationFolder = '../project_images/') {
        $filename       =   $fileArray['file']['name'];
        $tmp_name       =   $fileArray['file']['tmp_name'];
        $filesize       =   $fileArray['file']['size'];
        $file_error     =   $fileArray['file']['error'];
        $file           =   $fileArray['file'];
        // Save all the default data.
        $return['error']        =   true;
        $return['success']      =   false;
        $return['file']['dest'] =   $destinationFolder.$filename;
        $return['file']['size'] =   $filesize;

        if($file_error == 0)
            $return['error']    =   false;
        if(!is_dir($destinationFolder))
            mkdir($destinationFolder,0755,true);
        // If your filename is not empty, return success or fail of upload
        if (!empty($filename))
            $return['success']  = (move_uploaded_file($tmp_name, $destinationFolder.$filename));

        return $return;
    }

try {
    $con = getConfig('pdo');
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    function SaveToDb($con,$filename = false) {
        // Return fail immediately if the connection is false or image is invalid
        if(empty($filename) || !$con)
            return false;
        $project_sql = "
            INSERT INTO quotes
            (p_name, p_img, p_alt, category, creator, status, date_added)
            VALUES(?, ?, ?, ?, ?, ?, NOW())
        ";
        if ($project_stmt = $con->prepare($project_sql)) {
            $project_stmt->execute(array($p_name, $p_img, $p_alt, $category, $creator, $status));
            return true;
            $proj_succ = "Success";
            echo json_encode($proj_succ);
        }
        return false;
    }
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

    if(isset($_POST['create'])) {
        // Try uploading
        $upload =   UploadFile($_FILES);
        // If upload fails
        if(!$upload['success']) {
            echo '<h3>Sorry, an error occurred</h3>';
        }
        else {

            // Try to save it
            $saveToDb   =   SaveToDb($con,$upload['file']['dest']);
            // Get the profile from image name
            $profPic    =   ($saveToDb)? getPhoto($con,$upload['file']['dest']) : false;   
        }
    }

2 个答案:

答案 0 :(得分:0)

我认为您要发送到FormData的表单对象不是FormData期望的。

var form = document.forms.namedItem("fileinfo");
form.addEventListener('submit', function() {

  var oOutput = document.querySelector("div"),
      oData = new FormData(form);
}

you can read more

答案 1 :(得分:0)

那是因为您试图通过$_POST数组访问上传的文件,该数组不包含文件。您正在寻找的是$_FILES

Reference