2016-06-23 3 views
2

В настоящее время я использую этот код PHP для загрузки. Мне нужно знать, как добавить некоторую проверку типа файла для 1) расширения, 2) ограничение размера файла и 3) проверить, действительно ли файл выбран для загрузки.PHP Загрузить тип файла, размер и существование?

Спасибо за любую помощь.

<?php 
if(isset($_POST['submit'])){ 
    if(count($_FILES['upload']['name']) > 0){ 
     //Loop through each file 
     for($i=0; $i<count($_FILES['upload']['name']); $i++) { 
      //Get the temp file path 
      $tmpFilePath = $_FILES['upload']['tmp_name'][$i]; 

      //Make sure we have a filepath 
      if($tmpFilePath != "tmp/"){ 

       //save the filename 
       $shortname = $_FILES['upload']['name'][$i]; 

       //save the url and the file 
       $filePath = "uploads/" . date('d-m-Y-H-i-s').'-'.$_FILES['upload']['name'][$i]; 

       //Upload the file into the temp dir 
       if(move_uploaded_file($tmpFilePath, $filePath)) { 

        $files[] = $shortname; 
        //insert into db 
        //use $shortname for the filename 
        //use $filePath for the relative url to the file 

       } 
       } 
     } 
    } 

      header('Location: http://localhost/FloodMap/report.html'); 
      exit; 
} 
?> 
+2

Вы можете проверить это, чтобы получить расширение http://stackoverflow.com/questions/10368217/how-to-get-the-file-extension-in-php a для стороны, которую вы просто положили $ _FILES ['upload '] [' size '] – vibol

+0

Посмотрите эту ссылку, вы получите свой ответ: http://www.w3schools.com/php/php_file_upload.asp – Avishake

ответ

1

Для проверки расширения файла

$tmpFilePath = $_FILES['upload']['tmp_name'][$i]; 

    $imageFileType = pathinfo($tmpFilePath,PATHINFO_EXTENSION); 

    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
    && $imageFileType != "gif") { 
     echo "Only JPG, JPEG, PNG & GIF files are allowed."; 
    } 

Чтобы проверить размер файла

if ($_FILES["upload"]["size"][$i] > 500000) { 
    echo "Sorry, your file is too large."; 
} 

Для проверки файлов получил

if($_FILES['upload']['tmp_name'][$i]!=""){ 


} 
1
  • Поверка что файл успешно загружен

According to the manual PHP возвращает код ошибки в массиве $_FILES. Так, например ...

if ($_FILES['upload']['error'] == UPLOAD_ERR_OK) { 
    /* the file was uploaded successfully */ 
} 
  • Проверка расширения файла

Хотя $_FILES массив действительно обеспечивает расширение, важно помнить, что это клиент-Предоставленные данные и как таковые ему нельзя доверять. На самом деле единственной вещью в этом массиве, которой вы можете доверять, является ошибка и tmp_name, которые PHP предоставляет. Все остальное происходит от клиента.

Таким образом, чтобы убедиться, что файл несколько, что вы ожидаете, вы должны проверить файлы волшебные байты MIME против что-то вроде finfo_file

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimeType = finfo_file($finfo, $_FILES['upload']['tmp_name']); 

$allowedMimes = ['image/jpg','image/gif','image/png']; 

if (!in_array($mimeType, $allowedMimes, true)) { 
    throw new FileException("File not allowed..."); 
} 
  • Проверка размера файла

Опять , как отмечалось ранее, в то время как массив $_FILES предоставляет ключ размера для загрузки, то есть данные, предоставленные клиентом, и им не следует доверять. Вместо этого просто установите вместо этого filesize($_FILES['upload']['tmp_name']). Таким образом, вы проверяете фактический размер файла.


Bonus

FWIW, проверяя размер файла на уровне сервера (если только намерение состоит в том, чтобы сообщить пользователю этот файл слишком большой) делает довольно ужасный опыт пользователя. Лучше сначала делать такие вещи на уровне клиента, чтобы они знали, прежде чем они даже потрудились загружать файл, если он слишком велик.

В HTML5 мы можем сделать это с помощью File API. В вашей форме просто присоедините к прослушивателю событий, например onchange или что-то еще, и отметьте File.files[0].size, чтобы предупредить пользователя. Вы можете сделать то же самое и для типа файла.

Конечно, я не предлагаю вам не проверять ограничения на размер файла на стороне сервера, если вам нужно для других целей.Просто говоря, что само по себе, если это единственный способ сообщить пользователю, что они загрузили слишком большой файл, он калечит пользователя.

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