2016-05-30 2 views
0

У меня есть форма, в которую пользователи могут загрузить файл, и он отправит электронное письмо с файлом в виде вложения.Ошибка PHP-формы даже без прикрепленного файла

Проблема, с которой я сталкиваюсь, заключается в том, что предупреждение AJAX ниже всегда дает мне сообщение The uploaded file is not a supported file type. из кода PHP, даже если я не выбрал файлы для прикрепления.

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('[email protected]'); //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> 
+0

Могу ли я узнать, какой тип файла вы загружаете? –

ответ

1

Вы найдете, когда вы print_r($_FILES), даже если вы не прилагается файл, wil л даст вам этот массив:

Array 
(
    [uploaded_file] => Array 
     (
      [name] => 
      [type] => 
      [tmp_name] => 
      [error] => 4 
      [size] => 0 
     ) 
) 

Вы не хотите, чтобы проверить isset($_FILES['uploaded_file']), а если

  1. $_FILES['uploaded_file']['error'] == 0 или
  2. !empty($_FILES['uploaded_file']['name'])

EDIT:

Просто так я понимаю, мой ответ обращается к комментарию, что вы получаете сообщение об ошибке «... даже если я не выбрал файлы для прикрепления». Мой ответ объясняет, почему это произойдет.

+0

Badrush ограничивает формат файла. Ошибка в этом коде. –

+1

@Raj_King OP говорит, что они получают свою ошибку '' Ошибка: загруженный файл не поддерживает тип файла. '', Когда файл не прикреплен. Они, конечно, получат эту ошибку, потому что, когда они отправляют форму, они проверяют только, что установлен массив '$ _FILES', а не что-то прикрепленное. По умолчанию он установлен (он всегда будет «истинным»), поэтому расширение не существует, поэтому он всегда будет говорить, что при отсутствии файла. – Rasclatt

+0

Он проверяет расширение файла. если расширение не совпадает с его ограниченными форматами, он выдает сообщение об ошибке «Ошибка: загруженный файл не поддерживается типом файла». Это сообщение об ошибке, созданное следующим кодом. 'if (! $ Allowed_ext) { $ status ['type'] = 'Error'; $ status ['message'] = 'Ошибка: загруженный файл не поддерживает тип файла.'; echo (json_encode (статус $)); выход; '' Кроме этого, этот код работает с форматами 'jpg jpeg gif bmp png' –