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

Я делаю страницу где пользовательская загрузка файл. Я хочу, если оператор для создания переменной $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';
}

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

11
задан zeckdude 21 March 2010 в 07:34
поделиться

3 ответа

Поместите разрешенные типы в массив и используйте 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';
}
21
ответ дан 3 December 2019 в 02:52
поделиться

edit

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

Я оставлю все остальное здесь на случай, если это поможет кому-то другому, кто найдет это question


Для проверки 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.

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

8
ответ дан 3 December 2019 в 02:52
поделиться

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

1
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: