vadná validace formuláře podle mimetype?

jik
Člen | 149
+
0
-

Ahoj,
mám php 8.2.10, nette/forms 3.2.2 a formulář:

	protected function createComponentTabulkaForm() {
		$form = new Form;
		$form->addUpload('soubor', 'ze souboru')
			->addRule($form::MimeType, 'Soubor musí být ve formátu CSV.', 'text/csv')
			->addRule($form::MaxFileSize, 'Max velikost 10kB.', 10000);
		$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
		$form->addSubmit('run', 'Načti soubor');
		$form->onError[]   = function ($form){
			dump($form->getErrors());die;
		};
		$form->onSuccess[] = [$this, 'tabulkaFormSubmitted'];
		return $form;
	}

	public function tabulkaFormSubmitted($form, $values) {
		dump('prošlo');die;
	}

ten zobrazuji takto:

{form tabulkaForm}
<table>
	<tr>
		<td>popis</td>
		<td>Natažení tabulky</td>
	</tr><tr>
		<td>{label soubor /}</td>
		<td>{input soubor}</td>
	</tr><tr>
		<td></td>
		<td >{input run}</td>
	</tr>
</table>

{/form}

Je to tedy ruční vykreslení, mimoto používám netteForms.js a v .htaccess mám php_value upload_max_filesize 20M.
A teď zkouším do toho nahrávat různé soubory a různé velikosti a nastávají mi případy:

  1. pokus o nahrání souboru xcf (gimp) skončí hláškou „Soubor musí být ve formátu CSV.“ – v okénku a nutno odkliknout OK (v pořádku)
  2. pokus o nahrání souboru csv ~20kB skončí hláškou „Max velikost 10kB.“ – v okénku a nutno odkliknout OK (v pořádku)
  3. pokus o nahrání souboru csv ~20B (2 řádky s nějakými políčky rozdělenými ;) vběhne do onError a dump vypíše „array 0 ⇒ ‚Soubor musí být ve formátu CSV.‘“. A tady nechápu, proč toto nastalo. Jakým způsobem se vlastně vyhodnocuje to mimetype?

Děkuji za radu

Editoval jik (26. 7. 12:57)

nightfish
Člen | 509
+
0
-

jik napsal(a):

Jakým způsobem se vlastně vyhodnocuje to mimetype?

https://github.com/…alidator.php#… + FileUpload::getContentType() vrací hodnotu $_FILES pod klíčem type, kterou v rámci HTTP požadavku s uploadem souboru posílá prohlížeč.

jik
Člen | 149
+
0
-

nightfish napsal(a):

https://github.com/…alidator.php#… + FileUpload::getContentType() vrací hodnotu $_FILES pod klíčem type, kterou v rámci HTTP požadavku s uploadem souboru posílá prohlížeč.

Aha, takže tak trochu podraz ze strany fileinfo: ačkoliv máme mimetype text/csv, tak pro csv soubor tato funkce vrací text/plain. Děkuji.