Как изменить тип MIME файла с терминала?

То, что я ищу, является аналогом file -I (Darwin; -i на Linux).

Например, данный:

$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary

Я хотел бы сделать что-то вроде этого:

$ [someCommand] filename.pdf application/pdf

В результате будет указано, что filename.pdf будет набираться как application/pdf.

Причина вопроса заключается в том, что иногда веб-серверы используют неправильный тип MIME, что приводит к отказу программ в открытии файла. (Чаще всего текст/обычный, по моему опыту.)

Я искал man, веб-сайт и этот сайт около двух с половиной часов. Пробовал все от шестнадцатеричных дампов до xattr до текстовых редакторов.

Ваша помощь будет очень оценена.

Крис

Ответ 1

Что касается типов MIME, они почти полностью вымышлены.

MIME и HTTP просят нас притвориться, что все наши файлы имеют часть метаданных, идентифицирующих "тип контента". Когда мы отправляем файлы по сети, метаданные "тип контента" идут с ними, поэтому никто никогда не истолковывает содержимое файла.

Правда, эти метаданные не существуют. К тому времени, когда был изобретен MIME, было действительно слишком поздно убеждать любых поставщиков ОС принять новую систему типов для файлов. Unix поселилась на магических числах, DOS определилась с 3-буквенными суффиксами имен, а у классического MacOS были свои коды создателей и коды типов. (Коды типа MacOS были ближе всего к модели MIME, поскольку они фактически были отделены от имени файла и содержимого. Но, имея всего 4 буквы, типы MIME не подходят.)

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

В отличие от теории (где MIME исключает угадывание типа файла), MIME, реализованный на практике, переместил логику получателя файла "тип файла подтверждения" на основе имени суффикса имени файла и/или магического номера от получателя файла к отправителю. Как вы заметили, отправитель обычно не выполняет лучшую работу, чем получатель, если бы вынужден был понять это сам. Часто в случае веб-сервера желание сервера удалять Content-type в файле ухудшает ситуацию. Нет никаких оснований для того, чтобы веб-сервер знал что-либо о формате файлов, которые он обслуживает, когда он используется только для их распространения и не нуждается в интерпретации их содержимого.

Команда file угадывает тип файла, читая содержимое и ищет магические числа и строки. Опция -I не изменяет это. Он просто выбирает другой формат вывода.

Чтобы изменить заголовок Content-type, который веб-сервер отправляет для определенного файла, вы должны искать руководство по настройке своего веб-сервера. Там вы ничего не можете сделать с самим файлом.

Ответ 2

Если у вас есть pdf и ответ команды $file --mime-type octet-stream, а не application/pdf, у вас есть коррупция в вашем файле.

Читатели в формате PDF прочитают его и проигнорируют проблему, но если вы загрузите этот файл в веб-приложение, приложение распознает тип mime как октетный-sream. Иногда это проблема, в основном, если вы проверяете тип mime (у меня иногда возникает эта проблема в моем приложении).

Чтобы получить быстрое решение, используйте призрак script следующим образом:

gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf

Ответ 3

Это немного ошибка категории, чтобы говорить о типе MIME файла - файлы не имеют типов MIME; только октетные потоки имеют их (я не обязательно согласен с описанием типов MIME в @wumpus-q-wumbley как "вымышленный", но это еще один способ думать об этом).

MIME означает многоцелевые расширения электронной почты Интернета, как первоначально описано в RFC 2045, а типы MIME изначально предназначены для описания того, что такое приемник предположительно, чтобы сделать с кучей байтов в ближайшее время, чтобы следить за проводом, в остальной части сообщения электронной почты. Они были, естественно, перепрофилированы в (например) протоколе HTTP, чтобы позволить клиенту понять, как интерпретировать байты в ответе HTTP, который этот тип MIME формирует заголовком.

Тот факт, что команда file может отображать тип MIME, предполагает дальнейшее расширение идеи, чтобы действовать как ключ, который позволяет системе окон искать имя приложения, которое должно использоваться для открытия файла.

Таким образом, если "тип MIME файла означает что-либо, это означает" тип MIME, который веб-сервер будет префикс для этого файла, если он должен быть доставлен в ответ на HTTP-запрос (или что-то в этом роде). Подумав об этом, выяснилось, что тип MIME является частью конфигурации веб-сервера и не является чем-то неотъемлемым для файла - один файл может быть доставлен с различными типами MIME в зависимости от URL-адреса, который его извлекает, и сведения о запросе и конфигурации. Таким образом, файл XHTML может быть доставлен как text/html или application/xml или application/octet-stream в зависимости от деталей HTTP-запроса, каталога, в котором находится файл, или даже фазы луны (последний будет бесполезным сервером конфигурации).

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

Итак, ответ на ваш вопрос: это зависит.

  • Если вы хотите изменить, как веб-сервер предоставляет этот файл, вам нужно посмотреть либо документацию веб-сервера, или содержимое вашего системного файла /etc/mime.types (если ваша система использует это, и если сервер настроен на отказ от этого).
  • Если вы хотите изменить приложение, которое открывает заданный (тип) файл, тогда вам поможет документация вашего OS/window-manager.
  • Если вам нужно изменить вывод команды file, по какой-то другой причине, то man file является вашим другом, и вам, вероятно, придется тщательно обманывать файл волшебных чисел.