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

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

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

}
else
{

}

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

Ответ 1

тип 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.

Ответ 2

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

Вот как я в настоящее время проверяю типы 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
}

Ответ 3

Вы не всегда можете полагаться на тип 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
}

Неисправен код.

Ответ 4

Итак, я столкнулся с этим сегодня.

Была попытка проверить файл 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.
    }
}

Ответ 5

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

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

}
else
{

}

Ответ 6

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

Ответ 7

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