2009-11-16 5 views
1

У меня есть файл .doc, и я переименовал его, чтобы дать ему расширение .jpg. Когда я обрабатываю переименованный файл с помощью моей функции, он принимает файл как имеющий .jpg, хотя файл на самом деле не является JPEG. Каков наилучший способ найти фактический тип файла? Вот мой текущий код:Как получить тип файла в PHP

function getExtension($str) { 
    $i = strrpos($str,"."); 
    if (!$i) { return ""; } 
    $l = strlen($str) - $i; 
    $ext = substr($str,$i+1,$l); 
    return $ext; 
} 

Каков наилучший способ проверить тип файла без зависимости от расширения?

+2

я думаю вы имеете в виду * файл type *. Я не вижу способа определить «исходное расширение файла», если оно было переименовано. – pavium

+0

@pavium, я отредактировал вопрос, чтобы надеяться заставить его спросить, чего он хочет. –

+0

Спасибо, Доминик, я * мог это сделать, но я подумал, что это можно рассматривать как редактирование вопроса в соответствии с тем, что я думал *. – pavium

ответ

2

Это тот, который я использую, и он никогда не подводил меня.

function getExtension($str) 
{ 
    $i = explode('.', $str); 
    return strtolower(end($i)); 
} 

Я не знаю, если вы можете проверить фактическое оригинальное расширение файла, если кто-то переименовал его, вы должны иметь спецификацию каждого типа файла, который вы проверяли на я не уверен, как легко сказать. Но вы могли бы проверить, что что-то изображение, как это:

function isImage($file) 
{ 
    if(@getimagesize($file) == false) 
     return false; 
    else 
     return true; 
} 

Подытоживая

if(isImage($file) && getExtention($file) == "jpg") 
{ 
    //Process, it's a valid image 
} 
+0

explode() требует двух значения ;-) –

+0

Упс, спасибо thephpdev & DouweM. Пропустил это. – Sam152

0

Вы можете использовать explode(".", $sFileName) и взять последний элемент массива, чтобы сделать это, но это один терпит неудачу, когда у вас есть что-то вроде filename.tar.gz, если вам нужны последние два элемента массива, или filename.class.php, когда после того, как вы внедрили элемент с элементами из последних двух-массивов, вам просто нужен последний.

Лучший способ сделать это, на мой взгляд, pathinfo($sFileName). Это возвращает массив с ключами dirname, basename, extension (если есть) и filename.

Если вы хотите, чтобы тип файла, однако, вам нужно использовать что-то вроде встроенного PHP 5.3, Fileinfo, чтобы получить MIME-тип файла. (getimagesize() также возвращает MIME-тип, но это работает только на изображениях!)

4

Вы можете использовать PHP Fileinfo для определения типов файлов на основе их содержимого; однако он доступен только в PHP 5.3.0 или у вас есть доступ к установке расширений PECL.

Он возвращает файл mime-типа файла, например text/html, image/gif или application/vnd.ms-excel, который должен быть более точным (учетные записи могут содержать несколько общих расширений, таких как: jpg, jpe, jpeg).

+0

Ты маленькая красавица !! Именно то, что мне нужно! –

0

Во-первых, в отношении расширения файла, не изобретайте колесо. pathinfo() Используйте функцию РНР:

$extension = pathinfo($filename, PATHINFO_EXTENSION); 

Во-вторых, вы совершенно правы: расширение файла ничего не говорит вам о том, что это содержание.

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

Изображения довольно просты, потому что вы можете загрузить файл с помощью библиотеки GD. Это не удастся, если это не изображение, и вы можете допросить его по размеру и т. Д.

Документы Word сложнее. Если вы работаете в Windows, вы можете позвонить в систему, чтобы загрузить файл и посмотреть, действительно ли он загружается.Я не знаю ни одной собственной библиотеки PHP, которая может это сделать.

+1

Cletus, обнаружит ли это файл DOC, переименованный в JPG, как описано в OP? – pavium

+0

Эй, клетус, ты из Перта? Я живу в том же городе, что и переполнение стека, зарегистрированное пользователем №4. – Sam152

+0

Да, я живу в Перте. – cletus

0

Если вы просто хотите, чтобы получить расширение файла, вы можете использовать pathinfo:

function getExtension($str) 
{ 
    $info = pathinfo($str) 
    return $info['extension']; 
} 

Однако, это звучит, как вы хотите, чтобы проверить, если файл, который вы получили в действительное изображение. Чтобы сделать это, вы можете сделать что-то подобное с getimagesize() функции:

function getMimeType($str) 
{ 
    $info = @getimagesize($str) 

    if (!$info) 
    { 
     // Uh oh, this wasn't a valid image -- do some error handling 
     return NULL; 
    } 

    return $info['mime']; 
} 

Используя это, вы можете проверить тип MIME изображения («изображения/JPEG», и т.д.), и если данный файл проверки это действительно тот образ, который вы так думаете.

+0

Я пробовал это, но не работал. Его ничего не возвращает –

+0

Странно. Меня устраивает. Таким образом, он даже не вводит 'if (! $ Info)' условный вообще? Это просто возвращает '$ info ['mime']' как пустую строку? Если это так, вы можете проверить это вместо этого. – hbw

+0

Нет, я пробовал это: $ getimage = getimagesize ($ filename); \t \t echo "File Mime Type;". $ Getimage ['mime']; –

0
echo "<select onchange=\"window.location = 'file.php?'+this.value\">"; 

или это, если вам понравился один вкладыш без необходимости вставлять скрипты. :)

0
function file_extension($filename) { 
    $path_info = pathinfo($filename); 
    return $path_info['extension']; 
} 
Смежные вопросы