Uložení souboru na hosting

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

Zdravím,

samozdrejmne jsem četl dokumentace o nahrátí souboru.

Obrázky zpracovávám a ukládám v pohodě

Form


        $form->addUpload('img', 'Nahrát obrázek')

                ->addCondition(Form::FILLED)

                ->addRule(Form::IMAGE, 'Soubor musí být obrázek - .jpg, .gif, .png')

                ->addRule(Form::MAX_FILE_SIZE, 'Soubor je příliš velký! Povolená velikost je 2M.', 2 * 1024 * 1024);

Zpracovani z formu

if ($values->img->getName()) {

                // Zpracovani img
                $img_name = Strings::webalize(new \Nette\DateTime);


                // Pohyb souboru a zpracovani
                $img = Image::fromFile($values->img);
                $img->resize(500, NULL, Image::SHRINK_ONLY);
                $img->toString(\Nette\Image::PNG);
                $img->save("upload/" . $img_name . ".png");
                $this->soubory->insert(array(
                    "carousel_id" => $id,
                    "cesta" => "/upload/" . $img_name . ".png"
                ));
            } else {
                unset($values->img);
            }

Ale již nikde se nemůžu dočíst, jak řešit když je soubor třeba PDF, DOC, EXE, AVI atd …

Logicky ->save, ->move atd nefunguje kdyz to neni obrazek

Zkoušel jsem

if($values->upload) {
        // Prace se souborem
        $name = $values->upload->name;
        $names = "/upload/" . $name;
        $soubor = FileSystem::write($name, $names, $mode = 0666);
        //$soubor->move('/upload/' . $name);
        }

Ale taktéž bez úspěchu…

Děkuji za každou radu!

David Kudera
Člen | 455
+
0
-

No ani ten obrázek neukládáš až tak v pohodě. Minimálně si to můžeš usnadnit tak, že místo ručního vytváření použiješ tohle:

$img = $values->img->toImage();

jinak to img v proměnné values je objekt FileUpload a v něm je i metoda move , kterou právě použiješ na uložení čehokoliv (nezáleží na typu souboru)

Edit: a taky když už máš use pro Nette\Image, tak není potřeba používat (ani to není doporučené) celý tento kód: \Nette\Image::PNG. Takže stačí jen Image::PNG. A taky by to chtělo udělat něco i s tím Nette\DateTime ;-)

Edit 2: no a ještě cestu k obrázku nějak dát líp. Třeba něco jako __DIR__. '/../../www/uploads/'. $img_name. '.png'? Ať to ví, kam to vlastně přesně uložit. Líp ale třeba přes nějakou konfiguraci apod.

Editoval David Kudera (13. 8. 2014 8:08)

wicked
Člen | 290
+
0
-

OK, vím že nemám bestpractics na ukladání obrázků, ale jak tedy udělat ukládání čehokoli?

if($values->upload) {
        // Prace se souborem
        $name = $values->upload->name;
        $names = "/upload/" . $name;
        //$soubor = FileSystem::write($name, $names, $mode = 0666);
        $names->move('/upload/' . $name);
        }

Omlouvám se, až potom co jsem to dopsal jsem to vyřešil takto

if($values->upload) {
        // Prace se souborem
        $doc = $values->upload;
        $doc->move("upload/" . $values->upload->name);
        }