Как я могу разрешить только определенные типы файлов при загрузке в php? - PullRequest
11 голосов
/ 21 марта 2010

Я делаю страницу, где пользователь загружает файл. Я хочу, чтобы оператор 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. Как бы я это сказал?

Ответы [ 4 ]

21 голосов
/ 21 марта 2010

Поместите разрешенные типы в массив и используйте 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';
}
8 голосов
/ 21 марта 2010

edit

Я только что понял, что вы хотите разрешить и 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 может иметь два разных типа пантомимы.

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

1 голос
/ 21 марта 2010

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

0 голосов
/ 07 сентября 2018

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

<?
$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";
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...