【问题标题】:File Upload PHP AJAX文件上传 PHP AJAX
【发布时间】:2014-03-22 16:54:30
【问题描述】:

我有一个正在使用 Jquery Validate 插件进行验证的表单。此表单有一个文件输入,用户可以使用它上传他/她的个人资料图片。现在,使用验证插件提交处理程序,我将整个表单发布到 PHP 文件,但服务器脚本无法读取 $_FILE['my_id']

形式:

<form id="faculty-add" class="form-horizontal" enctype="multipart/form-data" role="form">
  <fieldset>
    <!-- Other Fields -->
    <div class="form-group">
     <label for="facprof" class="col-sm-2 control-label">Profile Pic</label>
     <div class="col-sm-9 col-sm-offset-1">
      <input type="file" class="form-control input-large" id="facul_pic" name="facul_pic" accept="image/png" placeholder="Profile Image">
     </div>
    </div>
    <!-- Other Fields -->
    <div class="form-group">
     <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default">Create Faculty Profile</button>
 </div>
</div>
  </fieldset>
</form>

JS:

$.validator.addMethod('filesize', function(value, element, param) {
        // param = size (en bytes)
        // element = element to validate (<input>)
        // value = value of the element (file name)
        return this.optional(element) || (element.files[0].size <= param);
    });
    $.fn.clearFormFields = function(area) {
        $(area).find('input[type="text"],input[type="email"]').val('');
        $(area).find('input[type="text"],input[type="email"]').removeClass('valid');
        $(area).find('textarea').val('');
        $(area).find('textarea').removeClass('valid');
        $(area).find('label').html('');
        $(area).find('label').removeClass('valid');
        $(area).find('label').removeClass('success');
        $(area).find('label').removeClass('error');
        $(area).find('div').removeClass('error');
        $(area).find('div').removeClass('success');
    };

$('#faculty-add').validate({
    rules : {
        facul_name : {
            minlength : 6,
            required : true
        },
        facul_pic : {
            required : true,
            accept : "png|jpe?g|gif",
            filesize : 6291456

        },
        facul_designation : {
            required : true,
            minlength : 6
        },
        facul_email : {
            required : true,
            email : true

        },
        datepicker : {
            required : true
        },
        qualification : {
            required : true,
            minlength : 2
        },
        area_interest : {
            required : true,
            minlength : 5
        }

    },
    highlight : function(element) {
        $(element).closest('.form-control').removeClass('success').addClass('error');
    },
    messages : {
        facul_name : {
            required : "Please Enter Faculty Name"
        },
        facul_pic : {

            required : "Choose Faculty Profile Picture"
        },
        facul_designation : {
            required : "Enter Faculty Desgnation Ex: Asst. Professor"
        },
        facul_email : {
            required : "Enter a valid Email ID"
        },
        datepicker : {
            required : "Choose the faculty's Date of Joining"
        },
        qualification : {
            required : "Mention Faculty's highest qualification"
        },
        area_interest : {
            required : "Please mention atleast one Area of Interest"
        }

    },
    success : function(element) {
        element.text('').addClass('valid').closest('.control-group').removeClass('error').addClass('success');
    },
    submitHandler : function(form) {

        $("#loader-modal").modal('show');
        $.ajax({
            type : "POST",
            url : 'proc/add_faculty.php',
            data : $(form).serialize(),
            success : function(data) {
                if (data === '0') {// Everything Successful
                    $("#loader-modal").modal('hide');
                    $("#success-modal").modal("show");
                    $(this).clearFormFields("#faculty-add");
                } else {
                    if (data === '-1') {// dB Update failed
                        $("#loader-modal").modal('hide');
                        $("#failure-modal").modal("show");
                    } else {
                        if (data === '-2') {// File Upload failed
                            $("#loader-modal").modal('hide');
                            $("#upload-fail-modal").modal("show");
                        } else {
                            $("#loader-modal").modal('hide');
                            $("#upload-fail-modal").modal("show");
                        }
                    }

                    $(this).clearFormFields("#faculty-add");
                }

            },
            error : function(XMLHttpRequest, textStatus, errorThrown) {
                $("#loader-modal").modal('hide');
                $("#failure-modal").modal("show");
                $(this).clearFormFields("#faculty-add");
            }
        });
        return false;
    }
});

处理器:

if (isset($_FILES['facul_pic'])) {
    $file_name = $_FILES['facul_pic']['name'];
    $file_size = $_FILES['document']['size'];
    $file_tmp = $_FILES['document']['tmp_name'];
    $uploaded = $faculty -> upload_pic($file_name, $file_size, $file_tmp);
    if ($uploaded != "failed") {// else retruns file path
        $f_name = $_POST['facul_name'];
        $f_department = $_POST['facul_department'];
        $f_pic = $uploaded;
        $f_designation = $_POST['facul_designation'];
        $f_email = $_POST['facul_email'];
        $f_doj = $_POST['datepicker'];
        $f_qualification = $_POST['quallification'];
        $f_iExp_yr = $_POST['indus_year'];
        $f_iExp_mth = $_POST['indus_months'];
        $f_tExp_yr = $_POST['teach_years'];
        $f_tExp_mth = $_POST['teach_months'];
        $f_lPub = $_POST['pub_national'];
        $f_iPub = $_POST['pub_international'];
        $f_interest = $_POST['area_interest'];
        $resp = $faculty -> add_faculty($f_name, $f_department, $f_pic, $f_designation, $f_email, $f_doj, $f_qualification, $f_iExp_yr, $f_iExp_mth, $f_tExp_yr, $f_tExp_mth, $f_lPub, $f_iPub, $f_interest);
        if ($resp == true) {
            echo '0';
        } else {
            echo '-1';
        }
    } else {
        echo '-2';
    }
} else { 
    echo '-3';
}

这里声明

if (isset($_FILES['facul_pic']))  

返回 False,因此 AJAX 响应始终为 -3

请帮我解决这个问题。

【问题讨论】:

  • 试试if($_FILES['facul_pic']['name'] != "")
  • 试试我的答案。它可能会帮助你
  • 无法在服务器端接收文件,我正在使用数据:$(form).serialize()

标签: php jquery ajax file-upload upload


【解决方案1】:

注意:有关更完整的选项,请参阅How can I upload files asynchronously?


通过 ajax 发送文件需要一些更特殊的设置,还需要使用FormData

submitHandler: function (form) {
    var formData = new FormData(form);

    $.ajax({
        url: 'proc/add_faculty.php',
        type: 'POST',
        data: formData,
        contentType: false,
        processData: false
        success: function (data) {
            if (data === '0') { // Everything Successful
                $("#loader-modal").modal('hide');
                $("#success-modal").modal("show");
                $(this).clearFormFields("#faculty-add");
            } else {
                if (data === '-1') { // dB Update failed
                    $("#loader-modal").modal('hide');
                    $("#failure-modal").modal("show");
                } else {
                    if (data === '-2') { // File Upload failed
                        $("#loader-modal").modal('hide');
                        $("#upload-fail-modal").modal("show");
                    } else {
                        $("#loader-modal").modal('hide');
                        $("#upload-fail-modal").modal("show");
                    }
                }

                $(this).clearFormFields("#faculty-add");
            }

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            $("#loader-modal").modal('hide');
            $("#failure-modal").modal("show");
            $(this).clearFormFields("#faculty-add");
        }

    });
}

【讨论】:

  • 好的。看来我已经过去了。谢谢,但我有 500 内部服务器错误。我猜脚本的其余部分有问题,必须重新检查。但是formdata支持不够好。
  • @Genocide_Hoax 是的,FormData 相对较新。或者,您可以使用 iframe 作为后备
  • iframes 如你能详细说明吗?
  • @Genocide_Hoax 你用proc/add_faculty.php 的url 创建一个隐藏的iframe 并将数据发布到它(你可以使用form 中的target 属性)。
【解决方案2】:

试试这个

if (!file_exists($_FILES['facul_pic']['tmp_name']) || !is_uploaded_file($_FILES['facul_pic']['tmp_name'])) 
{
    echo "file not uploaded";
}
else
{
   // do your stuff here
}

【讨论】:

    【解决方案3】:

    尝试像这样滚动整个数组

    foreach($_FILES as $name => $F){
            if($F['error']==UPLOAD_ERR_OK){
                                move_uploaded_file($F['tmp_name'],your_path);
                        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 2012-06-05
      • 2017-08-25
      • 2010-10-24
      • 2014-05-07
      • 2012-05-04
      相关资源
      最近更新 更多