2015-08-19 1 views
0

Я не уверен, что я делаю неправильно здесь. Мои заявления, если Арент работает, его, как оно не признает любой тип файла на все .....Загрузка файла PHP, разрешающая только указанные расширения

$file_name = validateInput($_FILES['file']['name']); 
$temp_name = validateInput($_FILES['file']['tmp_name']); 
$file_type = $_FILES['file']['type']; 

//get file extension 
$base = basename($file_name); 
$extension = substr($base, strlen($base)-4, strlen($base)); 

    //allowed file types 
    $allowed_extensions = array(".doc", "docx", ".pdf", ".png"); 

//check if attachment exist 

if(!empty($_FILES['file']['name'])){ 

    function validateInput($data) { 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return $data; 
    } 

    $file_name = validateInput($_FILES['file']['name']); 
    $temp_name = validateInput($_FILES['file']['tmp_name']); 
    $file_type = $_FILES['file']['type']; 

    //get file extension 
    $base = basename($file_name); 
    $extension = substr($base, strlen($base)-4, strlen($base)); 

    //allowed file types 
    $allowed_extensions = array(".doc", "docx", ".pdf", ".png"); 

    //check if uploaded file is allowed 
    if(in_array($extension, $allowed_extensions)){ 

     //email essentials 
     //$from = $email_address; 
     $to = '[email protected]'; 
     $subject = 'Applicant Application - '.$query; 
     $message = $html_email; 

     //handling the file 
     $file = $temp_name; 
     $content = chunk_split(base64_encode(file_get_contents($file))); 
     $uid = md5(uniqid(time())); 

     //standard mail headers 
     $headers = "From: ".$forenames." ".$surname."\r\n"; 
     //$headers = "Reply-To: $to \r\n"; 
     $headers .= "MIME-Version: 1.0\r\n"; 

     //declaring that we have muliple kinds of email(i.e content and attachment) 
     $headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; 
     $headers .= "This is a multi-part message in MIME format.\r\n"; 

     //plain text or html part 
     $headers .= "--".$uid."\r\n"; 
     $headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; 
     $headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; 
     $headers .= $message."\r\n\r\n"; 

     //attachment part 
     $headers .= "--".$uid."\r\n"; 
     $headers .= "Content-type: ".$file_type."; name=\"".$file_name."\"\r\n"; 
     $headers .= "Content-Transfer-Encoding: base64\r\n"; 
     $headers .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n"; 
     $headers .= $content."\r\n\r\n"; 

     //send the mail(without message, as msg is already in header) 
     if(mail($to, $subject, "", $headers)){ 
      $success = true; 
     } else { 
        echo "<script> 
        alert('Failed to send the message. File type not allowed'); 
        </script>"; 
     } 


    } else { 
     echo "<script> 
     alert('Failed to send the message. File type not allowed'); 
     </script>"; 
    } 

}//attachment check 

Я также хотел бы знать, лучший способ ограничения размера файла.

Спасибо,

Wale

+0

У вас есть много условий 'if'. Какой из них не работает? – Chayan

+0

Для получения расширений файлов используйте $ current_ext = preg_replace ("/.*\.([^.]+)$/", "\\ 1", $ filename); –

+1

Лучшими способами получить расширение файла является использование функции pathinfo или объекта spifileinfo, регулярное выражение не является чем-то, что я советую использовать для получения расширения –

ответ

0

, как вы получаете расширение файла не годится. Вы вычитаете последние 4 символа из имени файла, но как насчет .docx? Как вы думаете, он вернется, как другие? Вы должны использовать pathinfo, чтобы получить расширение файла.

$extension = pathinfo($filename, PATHINFO_EXTENSION);// will return doc/docx ect. without the leading dot(.). 

Так изменить свой код, как это (надеюсь, что это должно работать):

if(isset($_FILES['file']) && $_FILES['file']['size'] > 0){ 

    function validateInput($data) { 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return $data; 
    } 

    $file_name = validateInput($_FILES['file']['name']); 
    $temp_name = validateInput($_FILES['file']['tmp_name']); 
    $file_type = $_FILES['file']['type']; 

    //get file extension 
    $extension = pathinfo($file_name, PATHINFO_EXTENSION); 

    //allowed file types 
    $allowed_extensions = array("doc", "docx", "pdf", "png"); 

    //check if uploaded file is allowed 
    if(in_array($extension, $allowed_extensions)){ 

     .... 

    } else { 
     echo "<script> 
     alert('file format not allowed'); 
     </script>"; 
    } 

} else { 
    echo "<script> 
    alert('no file selected'); 
    </script>"; 
} 
+0

Большое спасибо, ваш вход работает отлично и позволил мне понять, что его заявление if для части электронной почты, которая не работает ... Можете ли вы, пожалуйста, помочь мне заглянуть в нее? – Wale

+0

удалите '$ headers' из функции почты и попробуйте. Если это работает, а проблема в ваших '$ headers'. @ Wale – Chayan

+0

я взял пустой« », и теперь он отправляет, теперь проблема заключается в приложении, которое теперь отправляется как чистый текст в теле письма – Wale

0

вы можете slipt имени файла в массив и проверить последнее значение массива с концом ($ обр) и сравните с используя массив in_array. Надеюсь, это может вам помочь.

+0

, выясняется, что инструкция if для отправки электронной почты не работает ... – Wale

Смежные вопросы