Я работаю над PHP-приложением, которое должно импортировать файл excel в MySQL. Поэтому мне нужно преобразовать файл excel в формат .csv. Но когда я хочу получить его тип, используя $_FILE['something']['type']
, я получаю application/octet-stream
качестве своего mime-типа;
Я думаю, что здесь что-то не так. Потому что я собрал список ниже в виде .csv-файла mime-type:
text/comma-separated-values, text/csv, application/csv, application/excel, application/vnd.ms-excel, application/vnd.msexcel
Что случилось?
В такие времена официальная спецификация HTTP всегда полезна. Из RFC 2616 7.2.1 (добавлено мной):
Любое сообщение HTTP / 1.1, содержащее тело-сущность, СЛЕДУЕТ включать поле заголовка Content-Type, определяющее тип носителя этого тела. Если и только если тип материала не задан поле Content-Type, получатель МОЖЕТ попытаться угадать тип носителя путем проверки его содержимого и / или расширений имен URI, используемых для идентификации ресурса. Если тип носителя остается неизвестным, получатель ДОЛЖЕН относиться к нему как к типу «приложение / октет-поток» .
Причиной вашей проблемы является то, что сервер, принимающий загрузку файла, сам не знает, какой тип файла был загружен. Зачем? Поскольку он использует HTTP-сообщение, которое отправляет файл, чтобы указать заголовок Content-Type
для определения точного типа mime. Браузер, скорее всего, не отправил заголовок Content-Type
и сервер принял application/octet-stream
в соответствии с официальным выпиской спецификации HTTP выше. Также возможно, что клиент, загружающий файл, решил не определять тип mime файла, который он загружал, и отправил заголовок Content-Type: application/octet-stream
.
Теперь, когда мы рассматриваем это в сочетании с руководством по PHP, касающимся загрузки файлов POST , мы видим следующее:
$_FILES['userfile']['type']
Тип mime файла, если браузер предоставил эту информацию. Примером может служить «image / gif». Этот тип mime, однако, не проверяется на стороне PHP и поэтому не принимает его значение как должное.
Итак, как вы можете видеть, даже если $_FILES['userfile']['type']
указан, он соответствует только заголовку Content-Type
отправленному клиентом. Эту информацию можно легко подделать, и на нее нельзя положиться. Если вам нужно убедиться, что загруженный файл имеет определенный тип, вам нужно будет убедиться в этом сами.
application/octet-stream
всегда используется, если тип mime неизвестен.
Все перечисленные типы mime отображаются как общие типы mime для файлов csv на http://filext.com/file-extension/CSV
Поэтому в основном я бы сказал, что это сводится к тому, какая программа сгенерировала файл .csv и какой тип mime они решили использовать.
$_FILE['something']['type']
заполняется операционной системой браузера / пользователя, поэтому он не является надежным. Вы должны сделать свою собственную проверку на стороне сервера, чтобы определить, был ли загруженный файл в нужном формате.