Почему я получаю mime-тип CSV-файла как «application / octet-stream»?

Я работаю над 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'] заполняется операционной системой браузера / пользователя, поэтому он не является надежным. Вы должны сделать свою собственную проверку на стороне сервера, чтобы определить, был ли загруженный файл в нужном формате.