Я загружаю файл в 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 в браузере, когда пользователь загружает файл. Если вы нашли какое-то лучшее решение, сообщите мне, поскольку я также пытаюсь сделать то же самое и в том же состоянии – «доверенные пользователи, но пытающиеся избежать ошибки»,
простое использование «принять» и «потребовать» и избежать столь типичного и нежелательного кодирования.