Validace při uploadu a kontrole souboru

Skřetík
Člen | 11
+
0
-

Ahoj,

poradíte prosím, jak nejefektivněji/nejhospodárněji vyřešit validaci souboru, a následné zpracování? Jednoduchý příklad – uživatel má mít možnost vložit soubor ve formátu excel/cokoli podobného. Tohle jde vyřešit přes knihovnu, např. phpspreadsheet. Čili situace je, že ve validaci zkusím soubor otevřít phpspreadsheetem, zachytím exception pokud se nepodaří. Pak potřebuji zjistit zda má strukturu kterou chci, takže už musím soubor i nechat přeparsovat, zkontrolovat stav řádků, vyhodit případné errory.

Jenže tím se dostávám k tomu, že otevírám, kontroluji, i čtu již v onValidate. Ale otevřít i číst potřebuji současně v onSuccess. Takže

  1. v onValidate zkontroluji, otevřu, načtu, ověřím data. V onSuccess znovu (zkontroluji), otevřu, načtu, zpracuju. Nicméně to znamená dvakrát otevřený soubor, nakolik nějaký unset dat po validaci vyřeší paměť si nejsem 100 % jistý.
  2. v onValidate zkontroluji, otevřu, načtu, ověřím data, dám si načtená data do private/protected proměnné, v onsuccess již pracuji s tou načtenou proměnnou. Tady se to může teoreticky komplikovat pokud načítám např. po dávkách, a nejsem moc fanda po validaci souboru spoléhat na to, že podruhé se vše podaří stejně jako poprvé (červíček pochybností)
  3. na onValidate se vykašlu, v onSuccess zkontroluji, otevřu, načtu, ověřím, zpracuji. Pokud bude error, přidám form->addError, pokud ne, flashMessage a redirect.
  4. varianty co mě nenapadly

No a teď přemýšlím co z toho je nejhospodárnější z hlediska času a prostředků.

Děkuji moc.

dakur
Člen | 493
+
0
-

Jestli ho potřebuješ otevírat kvůli struktuře, pak tipuju, že je to už práce modelu, ne presenteru, který bude kontrolovat správnost obsahu. Takže bych to viděl na onSuccess + exception:

$form = new Form();
$form->onSuccess[] = function (Form $form) {
	try {
		$this->someModel->addSpreadSheet($spreadSheet);

	} catch (MissingColumn $e) {
		$form->addError('Chybí sloupec');
	}
};

Na kontrolu samotné informace, zda uživatel nahrál sheet, pak stačí kontrola MIME typu, bych řek. 🙂

Editoval dakur (23. 2. 2021 13:31)