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 может иметь два разных типа пантомимы.
Надеюсь, это поможет.