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

Я делаю страницу, где пользователь загружает файл. Я хочу, чтобы оператор 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. В этом случае проверьте класс и функции Fileinfo PHP . Но что касается безопасности, вы все равно не должны полагаться на $_FILES[]['type'] 🙂

Я оставлю остальных здесь, если это поможет кому-то, кто находит этот вопрос


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

Вы должны использовать getimagesize() если вы хотите разрешить 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 Framework 's Zend_File_Transfer_Adapter_Http и Zend_Form_Element_File . Вы можете добавить несколько различных валидаторов, таких как минимальное разрешение изображения, тип MIME, минимальный размер файла, разрешенные расширения файлов и т. Д.