fix: Windows import file validation

This commit is contained in:
Dan Harrin
2025-06-12 15:55:09 +01:00
parent dfbce05def
commit 74f651a8a0
@@ -30,7 +30,6 @@ use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Number;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\File;
use Illuminate\Validation\ValidationException;
use League\Csv\Bom;
use League\Csv\CharsetConverter;
@@ -616,45 +615,43 @@ trait CanImportRecords
{
$fileRules = [
'extensions:csv,txt',
File::types(['csv', 'txt'])->rules([
function (string $attribute, mixed $value, Closure $fail) {
$csvStream = $this->getUploadedFileStream($value);
function (string $attribute, mixed $value, Closure $fail) {
$csvStream = $this->getUploadedFileStream($value);
if (! $csvStream) {
return;
if (! $csvStream) {
return;
}
$csvReader = CsvReader::createFromStream($csvStream);
if (filled($csvDelimiter = $this->getCsvDelimiter($csvReader))) {
$csvReader->setDelimiter($csvDelimiter);
}
$csvReader->setHeaderOffset($this->getHeaderOffset() ?? 0);
$csvColumns = $csvReader->getHeader();
$duplicateCsvColumns = [];
foreach (array_count_values($csvColumns) as $header => $count) {
if ($count <= 1) {
continue;
}
$csvReader = CsvReader::createFromStream($csvStream);
$duplicateCsvColumns[] = $header;
}
if (filled($csvDelimiter = $this->getCsvDelimiter($csvReader))) {
$csvReader->setDelimiter($csvDelimiter);
}
if (empty($duplicateCsvColumns)) {
return;
}
$csvReader->setHeaderOffset($this->getHeaderOffset() ?? 0);
$filledDuplicateCsvColumns = array_filter($duplicateCsvColumns, fn ($value): bool => filled($value));
$csvColumns = $csvReader->getHeader();
$duplicateCsvColumns = [];
foreach (array_count_values($csvColumns) as $header => $count) {
if ($count <= 1) {
continue;
}
$duplicateCsvColumns[] = $header;
}
if (empty($duplicateCsvColumns)) {
return;
}
$filledDuplicateCsvColumns = array_filter($duplicateCsvColumns, fn ($value): bool => filled($value));
$fail(trans_choice('filament-actions::import.modal.form.file.rules.duplicate_columns', count($filledDuplicateCsvColumns), [
'columns' => implode(', ', $filledDuplicateCsvColumns),
]));
},
]),
$fail(trans_choice('filament-actions::import.modal.form.file.rules.duplicate_columns', count($filledDuplicateCsvColumns), [
'columns' => implode(', ', $filledDuplicateCsvColumns),
]));
},
];
foreach ($this->fileValidationRules as $rules) {