2012-01-08 4 views
1

Я загружаю некоторые файлы. Ниже часть скрипта для загрузки (я использую коды из https://github.com/blueimp/jQuery-File-Upload/blob/master/php/index.php)Определенный тип файла mime для одного и того же файла

$upload = isset($_FILES[$this->options['param_name']]) ? 
       $_FILES[$this->options['param_name']] : null; 
$info = array(); 
if ($upload && is_array($upload['tmp_name'])) { 
    foreach ($upload['tmp_name'] as $index => $value) { 
    $info[] = $this->handle_file_upload(
    $upload['tmp_name'][$index], 
      isset($_SERVER['HTTP_X_FILE_NAME']) ? 
        $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index], 
      isset($_SERVER['HTTP_X_FILE_SIZE']) ? 
        $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'][$index], 
      isset($_SERVER['HTTP_X_FILE_TYPE']) ? 
        $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'][$index], 
        $upload['error'][$index] 
    ); 
} 

Когда проверил, тип мима через $_SERVER['HTTP_X_FILE_TYPE'] или $upload['type'][$index] возвращается application/vnd.openxmlformats-officedocument.presentationml.presentation, application/vnd.openxmlformats-officedocument.wordprocessingml.document для pptx, docx файлов соответственно.

Теперь, после завершения загрузки, я пытаюсь отобразить файлы, и я использую finfo_file(), чтобы получить тип mime.

$mime_type = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file_path); 
echo $mime_type; 

Для файлов изображений (например, PNG, JPEG) & PDF, возвращает тип, как и ожидалось, но для pptx и docx файлов, тип мим возвращаемые application/zip.

Почему он не возвращается так же, как при загрузке? Что-то не так с моим кодом, или я должен ожидать этого? Как я могу решить, какой именно тип файла?

ответ

1

В этом же файле могут быть разные и mulitple mime-types, что абсолютно нормально.

Кроме того, mime-тип является только метаинформацией рядом с самим файлом. Теоретически вы можете дать любому файлу любой тип mime. Это было бы не очень полезно, но оно работает. Это просто концепция.

Библиотека finfo попытается получить файл «mime-type» файла «магически», просмотрев файл, пытаясь определить формат. Затем он вернет тип mime в соответствии с его базой данных.

Почему он не возвращается так же, как при загрузке?

Тип mime в запросе задается клиентом HTTP. Он также может догадываться, но часто он принимает значение из информации, которую базовая операционная система предоставляет для этого файла.

Как вы можете видеть в своей проблеме, что чем более распространен тип файла, тем лучше он будет соответствовать (изображения).

Однако, как PPTX и DOCX файлы на самом деле являются ZIP-файлов, то finfo библиотека будет идентифицировать их как application/zip, потому что заголовки этих файлов (номер магии) показывают, что это технически почтовый файл.

С моим кодом что-то не так, или я должен ожидать этого?

Вы не должны ожидать, что тип mime finfo соответствует типу запроса mime-type. Это две разные вещи.

Как определить, какой тип файла он тогда?

Это зависит. Вы можете доверять HTTP-заголовку, вы можете принять решение доверять finfo, вы также можете сравнить расширения файлов и комбинацию всех трех.

Кроме того, вы можете решить добавить еще больше. Это полностью зависит от того, что вы делаете с загруженным файлом.

+0

Так что, если я возьму 'finfo', есть способ определить тип файла дальше, чем просто определить, является ли это' zip'-файлом. Например, здесь, через «finfo», я смогу определить, является ли файл 'docx' или' pptx'? – ptamzz

+1

Технически это естественно, например, вы можете начать писать парсер для любого указанного типа файла, который вы хотели бы идентифицировать. Однако это требует специальных знаний о типах файлов и может быть громоздким. Кроме того, библиотеки для разных типов файлов могут уже существовать, чтобы проверить, действительно ли файл. Это сильно зависит от того, что вы планируете делать с файлами, чтобы вы могли решить, какой уровень детализации вам нужен для вашего приложения. – hakre

Смежные вопросы