Проверить загруженный файл в формате 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
простое использование "принять" и "требуется" в
и избегать столь типичного и нежелательного кодирования.