Как я могу разрешить загрузку только определенных типов файлов в php?

StackOverflow https://stackoverflow.com/questions/2486329

  •  21-09-2019
  •  | 
  •  

Вопрос

Я создаю страницу, на которую пользователь загружает файл.Я хочу, чтобы оператор if создавал переменную $error, если тип файла — любой другой jpg, gif или pdf.

Вот мой код:

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

if(/*$file_type is anything other than jpg, gif, or pdf*/) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}

У меня возникли трудности со структурированием оператора if.Как бы я это сказал?

Это было полезно?

Решение

Поместите разрешенные типы в массив и используйте in_array().

$file_type = $_FILES['foreign_character_upload']['type']; //returns the mimetype

$allowed = array("image/jpeg", "image/gif", "application/pdf");
if(!in_array($file_type, $allowed)) {
  $error_message = 'Only jpg, gif, and pdf files are allowed.';
  $error = 'yes';
}

Другие советы

редактировать

Я только что понял, что вы хотите разрешить и файлы PDF.В таком случае проверьте Класс и функции PHP Fileinfo.Но что касается безопасности, вам все равно не стоит полагаться на $_FILES[]['type'] :)

Остальное я оставлю здесь, на случай, если это поможет кому-то еще, кто найдет этот вопрос.


Чтобы проверить MIME-тип изображения, $_FILES[]['type'] может быть небезопасно.Эти данные отправляются браузером и могут быть легко подделаны.

Вам следует использовать getimagesize() функция, если вы хотите разрешить загрузку только изображений (несмотря на то, что ее название может вводить в заблуждение).Эта функция не просто выдаст вам размер, но и все данные об изображении, которые вам, вероятно, понадобятся.

Я использовал следующий скрипт в классе обработки изображений:

private function load_image_data($image_file) {

    // Firstly, to disambiguate a loading error with a nonexistant file error,
    // check to see if the file actually exists.
    if( ! file_exists($image_file) ) {
        throw new Nonexistent_Image_Exception("The file '{$image_file}' does not exist");
    }

    // We're going to check the return value of getimagesize, so we don't
    // need any pesky warnings or notices popping up, since we're going to
    // stop execution of this function if something goes wrong.
    $image_data = @getimagesize($image_file);

    if( $image_data === false ) {
        throw new Load_Image_Exception("Could not get image data from '{$image_file}'");
    }

    $this->size = new Dimensions($image_data[0], $image_data[1]);
    $this->mime = $image_data['mime'];

}

Заметить, что getimagesize() возвращает ассоциативный массив, содержащий индекс mime.Данные здесь достоверны.

В другой функции я проверил тип изображения mime и преобразовал его в PNG с помощью соответствующей функции GD:

private function load_image($image_file) {

    // Suppress warning messages because we're going to throw an
    // exception if it didn't work instead.
    switch( $this->mime ) {
    case 'image/jpeg':
    case 'image/pjpeg':
        $this->image = @imagecreatefromjpeg($image_file);
        break;
    case 'image/gif':
        $this->image = @imagecreatefromgif($image_file);
        break;
    case 'image/png':
        $this->image = @imagecreatefrompng($image_file);
        break;
    default:
        throw new Invalid_Image_Exception("The image was of an invalid type");
    }

    if( $this->image === false ) {
        throw new Load_Image_Exception("Loading of image '{$image_file}' failed");
    }

}

Вероятно, вам не понадобится все это делать, но вы сможете увидеть, какие типы mime отображаются для указанных вами типов файлов.Обратите внимание, что JPEG может иметь два разных типа MIME.

Надеюсь это поможет.

Смотрите также Zend-фреймворк's Zend_File_Transfer_Adapter_Http иZend_Form_Element_File.Вы можете добавить несколько разных валидаторов, таких как минимальное разрешение изображения, тип MIME, минимальный размер файла, разрешенные расширения файлов и т. д.

Используйте этот простой код...

<?
$path = $_FILES['file']['name']; // file means your input type file name
$ext = pathinfo($path, PATHINFO_EXTENSION);

if ($ext=="jpg" OR $ext=="jpeg" OR $ext=="gif" OR $ext=="png") {
    // your code here like...
    echo "Upload successful";
}else{
    // your invalid code here like...
    echo "Invalid image format. Only upload JPG or JPEG or GIF or PNG";
}
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top