Подтвердить что ты не робот

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

Я работаю над PHP-приложением, которое должно импортировать файл Excel в MySQL. Поэтому мне нужно преобразовать файл excel в формат .csv. Но когда я хочу получить его тип с помощью $_FILE['something']['type'], я получаю application/octet-stream как его mime-тип; Я думаю, что здесь что-то не так. Поскольку я собрал список ниже в виде файла .csv mime-типа:

text/comma-separated-values,  
text/csv,  
application/csv, 
application/excel, 
application/vnd.ms-excel, 
application/vnd.msexcel

В чем дело?

4b9b3361

Ответ 1

В такие времена официальная спецификация HTTP всегда полезна. Из RFC 2616 7.2.1 (добавлено мной):

Любое сообщение HTTP/1.1, содержащее тело-сущность, ДОЛЖНО включать поле заголовка Content-Type, определяющее тип носителя этого тела. Если и только если тип материала не задан в поле Content-Type, получатель МОЖЕТ попытаться угадать тип носителя путем проверки его содержимого и/или расширений имен URI, используемых для идентификации ресурса. Если тип носителя остается неизвестным, получатель ДОЛЖЕН относиться к нему как к типу "application/octet-stream" .

Причиной вашей проблемы является то, что сервер, принимающий загрузку файла, сам не знает, какой тип файла был загружен. Зачем? Поскольку он использует HTTP-сообщение, которое отправило файл, чтобы указать заголовок Content-Type, чтобы определить точный тип mime. Вероятно, браузер не отправил заголовок Content-Type, а сервер предположил application/octet-stream в соответствии с официальной выпиской по HTTP-спецификации выше. Также возможно, что клиент, загружающий файл, решил не определять тип mime файла, который он загружал, и отправил сам заголовок Content-Type: application/octet-stream.

Теперь, когда мы рассматриваем это в сочетании с руководством PHP в отношении загрузки файлов POST docs, мы видим следующее:

$_FILES['userfile']['type']

Тип mime файла, если браузер предоставил эту информацию. Примером может служить "image/gif". Этот тип mime, однако, не проверяется на стороне PHP и поэтому не принимает его значение как должное.

Итак, как вы можете видеть, даже если $_FILES['userfile']['type'] указан, он соответствует только заголовку Content-Type, отправленному клиентом. Эту информацию можно легко подделать, и на нее нельзя положиться. Если вам нужно убедиться, что загруженный файл имеет определенный тип, вам нужно будет убедиться в этом.

Ответ 2

application/octet-stream всегда используется, если тип mime неизвестен.

Ответ 3

Все перечисленные вами типы mime отображаются как общие типы mime для файлов csv на http://filext.com/file-extension/CSV

Итак, в основном я бы сказал, что доходит до того, какая программа сгенерировала CSV файл и какой тип mime они решили использовать.

Ответ 4

$_FILE['something']['type'] заполняется оператором браузера/пользователя, поэтому он не является надежным. Вы должны сделать свою собственную проверку на стороне сервера, чтобы определить, был ли загруженный файл в нужном формате.