Problem s file uploadem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jirkamailto
Člen | 27
+
0
-

Dobry den, prochazel jsem forum ohledne file uploadu a v kodu mam nasledujici:

<?php
$form->addFile('picture', "Fotografie:")
    ->addRule(FORM::MIME_TYPE, "Zadejte správný typ souboru", 'image/*');
?>

a potom obsluha formulare

<?php
if ($form->isSubmitted())
{
    if ($form->isValid())
    {
        $values = $form->getValues();
	$file = $values['picture'];

	//$destination je uplna cesta k souboru
	$file->move($destination);
    }
}
?>

Vyse uvedeny kod mi nefunguje. Snazim se o nahrani souboru do urciteho adresare v adresari portalu. Pouzivam nette jen castecne a to zejmena na generovani formularu. V php mam safe mode vypnuty, /tmp directory je nastavena. Po spusteni tohoto kodu se nic nestane a ani se nevytvori soubor v /tmp. Prosim mohl by mi nekdo napsat, kde mam chybu, popr. funkcni kod? Predem dekuji za odpovedi.

Potreboval bych se jeste zeptat, zdali se do /tmp soubor nahrava jiz pri zavolani metody getValues() nebo az pri zavolani metody move?

lucass
Člen | 89
+
0
-

Metoda getValues() nad $form ti vrací jen hodnoty z formuláře. Vlastní kopírování dělá až move.

Pro debug bych:

  1. nejprve zjistil, jestli $file je instancí HttpUploadedFile,
  2. co obsahuje samotné $file,
  3. co ti vrátí move() – zřejmě false, jestli se nenakopíruje,
  4. jestli máš v $destination i název souboru, např. „/tmp/“ . $file->name, event. nějakej tvůj „/tmp/nazev.souboru“, nebo jestli vidí vůbec tu $destination(zkus třeba file_exists($destination)).

Podle mě bude chybka v $destination.

Editoval lucass (16. 11. 2009 20:57)

Ondřej Mirtes
Člen | 1536
+
0
-

Já bych zkontroloval $values['picture']->isOk() a $values['picture']->getError(). V $destination by měla být absolutní cesta, kam chceš soubor uložit.

Co všechno můžeš na HttpUploadedFile zkontrolovat nalezneš v API, případně si můžeš ten objekt dumpnout – Debug::dump($values['picture']).

Editoval Ondřej Mirtes (16. 11. 2009 22:04)

jirkamailto
Člen | 27
+
0
-

Diky moc, uz to funguje. Problem byl v tom, ze jsem jako destination daval nazev adresare, do ktereho se ma soubor nakopirovat ale uz bez nazvu souboru, pod kterym se ma ulozit.

vypadalo to nasledovne:

spatne:

<?php
$destination = "/var/www/project/folder";
?>

dobre:

<?php
$destination = "/var/www/project/folder/file.png";
?>
jirkamailto
Člen | 27
+
0
-

Jeste jen doplneni, nefunguje to kdyz misto file.png je:

<?php
$name = $file->getName();

$destination = "/var/www/project/folder/$name";
?>

Nevim proc, ale nepodarilo se mi to rozchodit. Vyresil jsem ale jinak a to ze jsem nazev souboru dal natvrdo, protoze v mem pripade se jedna stejne o docasny file a hned po nahrani se presune pomoci bashovskeho skriptu.