Команды 'file --mime-type' и 'mimetype', возвращающие разные результаты


9

Привет, я пытаюсь понять, почему PHP возвращает тип файла «msword», когда он должен быть «excel», поэтому проверил на моем Ubuntu box, используя команды «file» и «mimetype». Как видно из результатов ниже, они дают разные результаты. Кто-нибудь может объяснить, почему?

root@dev:~# file --mime-type 1.xls
1.xls: application/msword
root@dev:~# mimetype 1.xls
1.xls: application/vnd.ms-excel

Следует также отметить, что рассматриваемый файл возвращает «msword» на Windows Server. Он был создан с использованием PHPExcel.

Спасибо за вашу помощь.

Ответы:


7

fileполучает свои результаты от /etc/mime.types.

Оттуда:

применение / Mathematica давности
Применение / мс-TNEF
приложение / msaccess mdb
приложение / MSword Doc точка
Приложение / Новости-сообщение-идентификатор
Применение / Новости-передачи
Приложение / OCSP-запрос
Применение / OCSP-ответ

mimetype получает его от ...

ENVIRONMENT

   XDG_DATA_HOME
   XDG_DATA_DIRS
       These variables can list base directories to search for data files.
       The shared mime-info will be expected in the "mime" sub directory
       of one of these directories. If these are not set, there will be
       searched for the following directories:

               $HOME/.local/share/mime
               /usr/local/share/mime
               /usr/share/mime

       See also the "XDG Base Directory Specification"
       http://freedesktop.org/Standards/basedir-spec
       <http://freedesktop.org/Standards/basedir-spec>

Стоит отметить, что эта часть на странице руководства для mimetype:

Для обозначения переключателей я следовал руководству по файлу (1) версии 4.02, когда это было возможно. Похоже, они полностью отличаются от спецификации в главе «Утилиты» IEEE Std 1003.1-2001 (POSIX).

Так что вы можете назвать это ошибкой в ​​файле, /etc/mime.typesтак как vnd.ms-excelэто более точно.


Похоже, я застрял с проблемой на Windows и Linux. Спасибо за объяснение.
scampbell

да, и думаю об этом ... Mimetype, вероятно, только для настольных компьютеров, поэтому при работе с сервером вы собираетесь использовать файл.
Rinzwind

Я на 12.04 и, кажется, редактирование /etc/mime.typesне влияет на результаты file.
congusbongus

5

Существует аналогичная разница между двумя инструментами для .debпакетов.

Это кажется , что файл использует /etc/mime.typesи mimetypeиспользует много сложной кашицы более XDG_DATA_DIRSman mimetypes):

ENVIRONMENT
       XDG_DATA_HOME
       XDG_DATA_DIRS
           These variables can list base directories to search for data files. The shared mime-info will be expected in the "mime" sub directory of one of these directories. If these are not set,
           there will be searched for the following directories:

                   $HOME/.local/share/mime
                   /usr/local/share/mime
                   /usr/share/mime

           See also the "XDG Base Directory Specification" http://freedesktop.org/Standards/basedir-spec <http://freedesktop.org/Standards/basedir-spec>

FILES
       The base dir for all data files is determined by two environment variables, see "ENVIRONMENT".

       BASE/mime/packages/SOURCE.xml
           All other files are compiled from these source files. To re-compile them use update-mime-database(1).

       BASE/mime/globs
           Compiled information about globs.

       BASE/mime/magic
           Compiled information about magic numbers.

       BASE/mime/MEDIA/SUBTYPE.xml
           Descriptions of a mimetype in multiple languages, used for the "--describe" switch.

Похоже, я застрял с проблемой на Windows и Linux. Спасибо за объяснение. Извинения я не могу отметить 2 как ответ. Оба были на месте.
scampbell

1

Мне потребовалось некоторое время, чтобы найти его, но я смог установить mimetype на Debian.

sudo apt-get install libfile-mimeinfo-perl

Теперь я получаю application/vnd.ms-excelза .xls вместо application/msword.


0

Вы упоминали, что делаете это на PHP. Я сталкивался с такими различиями при получении файла MIME. Они отличаются. Чтобы правильно сделать это в PHP, вы должны использовать finfo

$finfo = new finfo();
$mime = $finfo->file($path_to_file, FILEINFO_MIME);

Спасибо, я уже использую эту функцию. Возвращает неверный формат. Вот почему я тестировал.
scampbell

какой формат он возвращает?
до

Смотреть оригинальный вопрос
scampbell

Вы не упомянули там, что использовали finfo. Это возвращает msword?
ЛЛТ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.