Проверить загруженный файл в формате csv

Я загружаю файл в php и хочу только загрузить его, если это файл csv. Я считаю, что мой синтаксис подходит для типа содержимого. Он всегда переходит в инструкцию else, когда это файл csv. Что я здесь делаю неправильно?

if (($_FILES["file"]["type"] == "text/csv")) { } else { } 

Если я изменю тип контента, он работает для этого формата, а не csv.

тип mime может не быть text/csv некоторые системы могут читать / сохранять их разными. (например, иногда IE отправляет файлы .csv в качестве application/vnd.ms-excel ), поэтому вам лучше всего построить массив допустимых значений и протестировать его, а затем найти все возможные значения для проверки.

 $mimes = array('application/vnd.ms-excel','text/plain','text/csv','text/tsv'); if(in_array($_FILES['file']['type'],$mimes)){ // do something } else { die("Sorry, mime type not allowed"); } 

если вы хотите добавить дополнительную проверку, если mime будет возвращен как text / plain, вы можете запустить preg_match чтобы убедиться, что в нем достаточно запятых, чтобы быть csv.

Существует много возможных типов MIME для файлов CSV, в зависимости от ОС пользователя и версии браузера.

Вот как я в настоящее время проверяю типы MIME для своих файлов CSV:

 $csv_mimetypes = array( 'text/csv', 'text/plain', 'application/csv', 'text/comma-separated-values', 'application/excel', 'application/vnd.ms-excel', 'application/vnd.msexcel', 'text/anytext', 'application/octet-stream', 'application/txt', ); if (in_array($_FILES['upload']['type'], $csv_mimetypes)) { // possible CSV file // could also check for file content at this point } 

Вы не всегда можете полагаться на тип MIME.

Согласно: http://filext.com/file-extension/CSV

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

Существуют различные типы MIME для CSV.

Вероятно, вам лучше проверить расширение, опять же не очень надежное, но для вашего приложения это может быть хорошо.

 $info = pathinfo($_FILES['uploadedfile']['tmp_name']); if($info['extension'] == 'csv'){ // Good to go } 

Код не проверен.

Поэтому я столкнулся с этим сегодня.

Была попытка проверить файл MIME с загруженным CSV-файлом, просмотрев файл $_FILES['upload_file']['type'] , но для определенных пользователей в разных браузерах (и не обязательно одни и те же браузеры между указанными пользователями, например, он отлично работал для меня в FF, но для другого пользователя он не работал в FF) $_FILES['upload_file']['type'] как «application / vnd.ms-excel» вместо ожидаемого «text / csv», или "text / plain".

Поэтому я прибег к использованию (IMHO) гораздо более надежной функции finfo_ *, что-то вроде этого:

 $acceptable_mime_types = array('text/plain', 'text/csv', 'text/comma-separated-values'); if (!empty($_FILES) && array_key_exists('upload_file', $_FILES) && $_FILES['upload_file']['error'] == UPLOAD_ERR_OK) { $tmpf = $_FILES['upload_file']['tmp_name']; // Make sure $tmpf is kosher, then: $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $tmpf); if (!in_array($mime_type, $acceptable_mime_types)) { // Unacceptable mime type. } } 

Опция типа Mime не является лучшим вариантом для проверки файла CSV. Я использовал этот код, который хорошо работал во всех браузерах

 $type = explode(".",$_FILES['file']['name']); if(strtolower(end($type)) == 'csv'){ } else { } 

Поскольку вы беспокоитесь о том, что пользователь загружает другой файл по ошибке, я бы предложил вам использовать accept=".csv" в <input> . Он будет показывать только файлы csv в браузере, когда пользователь загружает файл. Если вы нашли какое-то лучшее решение, сообщите мне, поскольку я также пытаюсь сделать то же самое и в том же состоянии – «доверенные пользователи, но пытающиеся избежать ошибки»,

простое использование «принять» и «потребовать» и избежать столь типичного и нежелательного кодирования.