2016-05-30 38 views
0

我有一個表格,用戶可以選擇上傳文件,它會發送一個電子郵件作爲附件的文件。PHP表格錯誤,即使沒有附加文件

我遇到的問題是,即使我沒有選擇任何附加文件,下面的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('[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),即使你沒有連接一文件,威爾給你這個數組:

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'])

編輯:

就這樣我清楚,我的回答是解決您收到您的錯誤消息「...即使我沒有選擇任何文件附加」的評論。我的回答解釋了爲什麼會發生。

+0

Badrush限制文件格式。該代碼沒有錯誤。 –

+1

@Raj_King OP說他們得到錯誤''錯誤:上傳的文件不是支持的文件類型。'當沒有附加文件時。他們當然會得到這個錯誤,因爲當他們提交表單時,他們只檢查'$ _FILES'數組是否被設置,而不是附加任何東西。默認情況下,它被設置(aka總是成爲'true'),所以擴展名不存在,因此當沒有附加文件時,它總是會說。 – Rasclatt

+0

他正在驗證文件擴展名。如果擴展名與他的受限制格式不匹配,他會拋出一個錯誤:「錯誤:上傳的文件不是受支持的文件類型。」# 這是由以下代碼引發的自定義錯誤消息。如果(!$ allowed_ext){ $ status ['type'] ='錯誤'; $ status ['message'] ='錯誤:上傳的文件不是支持的文件類型。 echo(json_encode($ status)); 退出; ' 除此之外,此代碼使用'jpg jpeg gif bmp png'格式 –