Laravel Excel, есть ли лучший способ, чем тщательная проверка типа MIME, чтобы убедиться, что загруженный файл на самом деле является электронной таблицей?

У меня есть инструмент, который позволяет пользователю загружать электронную таблицу, а затем я анализирую электронную таблицу с помощью Laravel-Excel. Моя проблема в том, как я могу проверить, что файл является допустимым файлом Excel, прежде чем пытаться его проанализировать?

Я посмотрел в документах PHPOffice / Laravel-Excel и не смог найти метод для проверки файла.
Итак, мое следующее предположение было, что если я попытаюсь загрузить () неверный файл, он сработает и выдаст предупреждение или ошибку. Однако вместо этого он проанализирует файл и попытается каким-либо образом преобразовать его в электронную таблицу. Например, я дал ему pdf, и он сгенерировал коллекцию, содержащую любой недвоичный мусор, который он мог найти в файле pdf. Это не желательно.

В настоящее время я делаю MIME-тип проверки для проверки файла.

//valid mime types

$mimeTypes = [
'application/csv', 'application/excel',
'application/vnd.ms-excel', 'application/vnd.msexcel',
'text/csv', 'text/anytext', 'text/plain', 'text/x-c',
'text/comma-separated-values',
'inode/x-empty',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
];
$file = request()->hasFile('file');
if ($file) {
if (in_array(request()->file('file')->getClientMimeType(), $mimeTypes)) {
//then parse the file
Config::set('excel.import.heading', 'original');
$data = Excel::load(request()->file('file')->path(), function ($reader) {
})->get();
//do some stuff with data...
} else {
//invalid file
}
} else {
//no file uploaded
}

Это не идеально, так как, кажется, существует экзотическое разнообразие возможных типов MIME, поэтому я должен был бы активно поддерживать список, и некоторые CSV-файлы имеют MIME-текст в виде простого текста, поэтому файлы не-CSV-незашифрованного текста будут проходить здесь , Существует ли какой-либо стандартный способ, предоставляемый Laravel, Laravel-Excel или PHPOffice, для проверки файла?

0

Решение

Вы только проверяете поставляемого пользователем Информация о расширении файла здесь.

string|null getClientMimeType()

Возвращает тип файла MIME.

Тип MIME клиента извлекается из запроса, из которого был загружен файл, так что это не должно рассматриваться как безопасное значение.

Для доверенного типа MIME используйте взамен getMimeType () (который угадывает тип MIME на основе содержимого файла).

Файл Symfony HttpFoundation Файл UploadedFile

Если вы хотите проверить магические байты MIME в самом загруженном файле, вы можете сделать это, полагаясь на магический байтовый файл MIME вашей операционной системы, подобный этому в PHP.

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
// $mime will contain the correct mime type
$mime = finfo_file($finfo, $_FILES['your-form-upload-input-name-here']['tmp_name'];
finfo_close($finfo);

Увидеть finfo_file Больше подробностей.

Чтобы сделать это специально с помощью компонента Symfony, на который вы в настоящее время полагаетесь, позвоните getMimeType() метод вместо. Обратите внимание, что разница в том, что getClientMimeType() использует предоставленную клиентом информацию, которой нельзя доверять, тогда как getMimeType() делает то же самое, что продемонстрировано с finfo_file() выше.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]