Проверьте загруженный файл в формате CSV - PullRequest
43 голосов
/ 11 июля 2011

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

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

}
else
{

}

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

Ответы [ 7 ]

70 голосов
/ 11 июля 2011

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

36 голосов
/ 23 октября 2012

Существует множество возможных типов 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
}
8 голосов
/ 11 июля 2011

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

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

5 голосов
/ 12 октября 2013

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

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

Поэтому я прибегнул к использованию (ИМХО) гораздо более надежных функций 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.
    }
}
3 голосов
/ 13 июня 2016

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

3 голосов
/ 13 декабря 2013

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

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

}
else
{

}
0 голосов
/ 08 августа 2017

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

...