Intereting Posts
HTML5 и getUserMedia – запись аудио и сохранение на веб-сервер через определенное время Как $ _GET ) работает в разбивке по страницам php Переменные сеанса PHP не переносятся на мою зарегистрированную страницу, но идентификатор сеанса Строка со структурой массива в массив Запуск тестов PHPUnit в определенном порядке файлы .docx через мой веб-сервер повреждены при открытии Как я могу отправить запрос POST с пробелами? php – помочь повысить эффективность этого генератора url в стиле YouTube php и html на одной странице Как выполнить запрос для вложенного массива в php и laravel с помощью mongoDB Преобразование плоского массива в дерево с однократным циклом Mockery – call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом Использование & amp; в URL-адресах ошибка $ _GET Настройка веб-проекта PHP, инфраструктуры Вызов нескольких хранимых процедур с помощью Zend Framework

PHPExcel: Как проверить, действителен ли файл XLS или нет?

Я использую PHPExcel 1.7.8 для чтения файлов .xls , загруженных пользователем радиолокатора. Все работает правильно с действительным файлом .xls , но теперь я хочу сделать несколько тестов с недопустимыми файлами, чтобы проверить, отображаются ли в программе хорошие сообщения об ошибках.

Поэтому я взял файл .csv и переименовал его в .xls (без преобразования ничего, просто изменив имя) до конца, просто чтобы проверить …
Сломанный! 🙂

 DOM ELEMENT: HTML DOM ELEMENT: BODY DOM ELEMENT: P START OF PARAGRAPH: END OF PARAGRAPH: FLUSH CELL: A1 => block,date,hour... array 1 => array 'A' => string 'block,date,hour...' (length=2777) {"step":"error","errors":[],"warnings":[]} 

Как вы можете видеть, отображается сообщение об ошибке, я не просил об этом, а затем JSON, который я обычно пишу.

Это происходит на этой линии:

 <?php echo "Loading file\n"; try { if (!($objPHPExcel = PHPExcel_IOFactory::load('path'))) { echo "Failed\n"; return; // ... } } catch(Exception $e) { echo 'Exception !'; } echo "Done\n"; 

И этот код отображает:

 Loading file /!\ ERROR MESSAGE ABOVE /!\ Done 

Мой вопрос в том, есть ли способ с PHPExcel или что-то еще, чтобы проверить, является ли файл допустимым файлом XLS, прежде чем я попытаюсь его проанализировать?

Спасибо.

Каждый читатель в PHPExcel имеет метод canRead (), который проверяет, что файл, переданный в read, имеет соответствующий формат для этого читателя – метод возвращает простое логическое значение True или False. Возврат True из вызова метода canRead () класса PHPExcel_Reader_Excel5 подтверждает, что этот файл может быть прочитан этим читателем, независимо от расширения файла.

Метод IOFactory ident () использует этот вызов, тестируя его по отношению к читателям для каждого поддерживаемого формата, пока он не вернется к вызову canRead (). Метод IOFactory load (), в свою очередь, использует функцию ident () для определения того, какой Reader следует использовать для указанного файла.

Возможность проверки типа файла (не зависящего от расширения файла, который часто может вводить в заблуждение) особенно полезна, когда вы хотите установить дополнительные аргументы для чтения.

Откат от ident () / load () немного менее удовлетворительный: если canRead () возвращает false для всех других Readers, тогда файл рассматривается как CSV.

Даже если это вопрос более чем на год, мне все еще сложно обдумать, как справиться с этой проблемой, я постараюсь опубликовать свой ответ здесь.

Если использование блока try / catch не работает (в моем случае я переименовал файл jpg в xls, и обработчик ошибок не работает, вместо того, чтобы бросать ошибку, неверный файл просто выдает предупреждение) , вы можете рассмотреть ручную проверку используя canRead() как сказал Марк, вот пример того, как использовать эту функцию.

Если вы знаете, что такое ваши типы файлов, вы можете определить его вручную и проверить на них:

 $valid = false; $types = array('Excel2007', 'Excel5'); foreach ($types as $type) { $reader = PHPExcel_IOFactory::createReader($type); if ($reader->canRead($file_path)) { $valid = true; break; } } if ($valid) { // TODO: load file // eg PHPExcel_IOFactory::load($file_path) } else { // TODO: show error message } 

Надеюсь, что это поможет любому, у кого есть такая же проблема.