PHP表单错误,即使没有附加文件

时间:2016-05-30 01:01:04

标签: php jquery ajax

我有一个用户可以选择上传文件的表单,它会发送一封包含该文件作为附件的电子邮件。

我遇到的问题是,即使我没有选择要附加的任何文件,下面的AJAX警报也总是从PHP代码中提供The uploaded file is not a supported file type.消息。

if (data.error) {
   alert(data.error.message);
 }`

AJAX代码:

$(document).ready(function (e){
$("#main-contact-form").on('submit',(function(e){
    e.preventDefault();
    $('#sendingemail').fadeIn();
        $.ajax({
        url: "../sendemail.php",
        type: "POST",
        data:  new FormData(this),
        contentType: false,
        cache: false,
        processData: false,
        success: function(data){
            if (data.error) {
                    alert(data.error.message);
                }
            else{
                $('#sendingemail').fadeOut();
                $('#emailsent').fadeIn();
              alert(data.message);
            }
        },
      error: function(XHR,textStatus,errorThrown) {
              console.log(data);
            //alert("error");
              alert(XHR.status);
            alert(textStatus);
            alert(errorThrown);
        }
    }           
 );
}));
});

PHP代码:

<?php

    header('Content-type: application/json');

            // WE SHOULD ASSUME THAT THE EMAIL WAS NOT SENT AT FIRST UNTIL WE KNOW MORE.
            // WE ALSO ADD AN ATTACHMENT KEY TO OUR STATUS ARRAY TO INDICATE THE STATUS OF OUR ATTACHMENT:  
            $status = array(
                            'type'          =>'Error',
                            'message'       =>'Couldn\'t send the Email at this Time. Something went wrong',
                            'attachement'   =>'Couldn\'t attach the uploaded File to the Email.'
            );

    //Added to deal with Files
    require_once('PHPMailer/class.phpmailer.php');

    if(isset($_FILES['uploaded_file'])){    
    //Get the uploaded file information
        $name_of_uploaded_file =
            basename($_FILES['uploaded_file']['name']);

        //get the file extension of the file
        $type_of_uploaded_file =
            substr($name_of_uploaded_file,
            strrpos($name_of_uploaded_file, '.') + 1);

        $size_of_uploaded_file =
            $_FILES["uploaded_file"]["size"]/1024;//size in KBs

        //Settings
        $max_allowed_file_size = 10000; // size in KB
        $allowed_extensions = array("jpg", "jpeg", "gif", "bmp","png");

        //Validations
        if($size_of_uploaded_file > $max_allowed_file_size )
        {
          $status['type']    = 'Error';
        $status['message'] = 'Error: Size of file should be less than ~10MB. The file you attempted to upload is too large. To reduce the size, open the file in an image editor and change the Image Size and resave the file.';
          echo(json_encode($status));
          exit;
        }

        //------ Validate the file extension -----
        $allowed_ext = false;
        for($i=0; $i<sizeof($allowed_extensions); $i++)
        {
          if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0)
          {
                $allowed_ext = true;
          }
        }

        if(!$allowed_ext)
        {
          $status['type']    = 'Error';
        $status['message'] = 'Error: The uploaded file is not a supported file type.';
          echo(json_encode($status));
            exit;
        }

  $upload_folder = "temp/";
        $path_of_uploaded_file = $upload_folder . $name_of_uploaded_file;
        $tmp_path = $_FILES["uploaded_file"]["tmp_name"];

        if(is_uploaded_file($tmp_path))
        {
          if(!copy($tmp_path,$path_of_uploaded_file))
          {
              $status['type']    = 'Error';
            $status['message']   = 'Error: Encountered an error while copying the uploaded file';
            exit;
          }
        }
}
    //--end

    $name = @trim(stripslashes($_POST['name'])); 
    $clientemail = @trim(stripslashes($_POST['email'])); 
    $subject = @trim(stripslashes($_POST['subject'])); 
    $message = @trim(stripslashes($_POST['message']));

    $body = 'Name: ' . $name . "\n\n" . 'Email: ' . $clientemail . "\n\n" . 'Subject: ' . $subject . "\n\n" . 'Message: ' . $message;

     $email = new PHPMailer();      

    $email->From      = $clientemail;
    $email->FromName  = $name;
    $email->Subject   = $subject;
    $email->Body      = $body;  
    $email->AddAddress( 'root@localhost.com' ); //Send to this email

    $email->isMail();

  if(isset($_FILES['uploaded_file'])){   
                if($email->AddAttachment( $path_of_uploaded_file , $name_of_uploaded_file )){
            $status['message']   = 'The Uploaded File was successfully attached to the Email.';  
        }
  }
        header("Content-Type: application/json; charset=utf-8", true);
 // NOW, TRY TO SEND THE EMAIL ANYWAY:
        try{
            $success    = $email->send();
            $status['type']    = 'success';
            $status['message']  = 'Thank you for contacting us. We will reply as soon as possible.';   
        }catch(Exception $e){
            $status['type']     ='Error';
            $status['message']  ='Couldn\'t send the Email at this Time. Something went wrong';     
        }   

 die(json_encode($status));

HTML:

        <form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" enctype="multipart/form-data">
            <div class="col-sm-5 col-sm-offset-1">
                <div class="form-group">
                    <label>Name *</label>
                    <input type="text" name="name" class="form-control" required="required">
                </div>
                <div class="form-group">
                    <label>Email *</label>
                    <input type="email" name="email" class="form-control" required="required">
                </div>
                <div class="form-group">
                    <label>Phone</label>
                    <input type="number" class="form-control">
                </div>
                <div class="form-group">
                    <label>Company Name</label>
                    <input type="text" class="form-control">
                </div>                        
            </div>
            <div class="col-sm-5">
                <div class="form-group">
                    <label>Subject *</label>
                    <input type="text" name="subject" class="form-control" required="required">
                </div>
                <div class="form-group">
                    <label>Message *</label>
                    <textarea name="message" id="message" required="required" class="form-control" rows="8" style="height:125px"></textarea>
                    <label for='uploaded_file' style="margin-top:10px">Select A Photo To Upload:</label>
                    <input type="file" name="uploaded_file">
                </div>                        
                <div class="form-group">
                    <button type="submit" name="submit" class="btn btn-primary btn-lg" required="required">Submit Message</button>
                </div>
            </div>
        </form> 

1 个答案:

答案 0 :(得分:1)

当你Array ( [uploaded_file] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) ) 时,你会发现,即使你没有附加文件,也会给你这个数组:

isset($_FILES['uploaded_file'])

您不想检查$_FILES['uploaded_file']['error'] == 0,而是

  1. !empty($_FILES['uploaded_file']['name'])
  2. -1
  3. 编辑:

    我很清楚,我的回答是解决您收到错误消息的评论“......即使我没有选择任何文件附加”。我的回答解释了为什么会发生这种情况。