Nahrávání obrázku /přílohy) na wedos

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

Dobrý den, rád bych vás požádal o pomoc s mým kódem. Hosting mám na wedosu, pokud takhle informace nějak pomůže. Mám formálář, přes který lze připojit přílohu ve formě obrázku. Ale po odeslání formuláře mi vyběhne laděnka s hláškou: Unknown image type or file ‚/data/web/virtuals/58696/virtual/tmp/phprvvslV.png‘ not found..

Pro ukázku zasílám i kousek kódu:

552:            if ($values['preview_header']->isOk()) {
553:              $name = Strings::random(1, '0-9').Strings::random(9).'.png';
554:              echo $values['preview_header']->getTemporaryFile();
555:              $image = Image::fromFile($values['preview_header']->getTemporaryFile().'.png');
556:              $image->resize(1100, 250, Image::EXACT);
557:              $image->save(__DIR__.'/../../../files/service/'.$data['url'].'/'.$name);`

Chyba je na řádku 555. Moc díjy za vaše případně reakce.

ondraondra81
Člen | 82
+
0
-

Nejsme si tak uplne jisty, ale podle me by tam nemelo byt to .png na konci. Zkusil bych si v tracy vypsat co ti to dava za hodnotu. (Ctu to na telefonu tak to nemuzu zkusit)

Editoval ondraondra81 (15. 4. 2015 7:16)

ondraondra81
Člen | 82
+
0
-

Tak jsem na to koukal, je to jak si myslel.
Já to používám takto:

 //nahrani fotek
    /**
     * Formulář pro MultiUpload
     * @return Form
     */
    public function createComponentUploadForm()
    {
        $form = new Form; //($this, $name);
        $form->getElementPrototype()->class[] = "ajax";

        /*$form->addText("test","Textové políčko")
            ->addRule(Form::FILLED, "Textové políčko test musí být vyplněno!");*/

        // Uploadů můžete do formuláře samozdřejmě přidat více, ale zatím je docela nepříjemná validace a jedna chybka v JS
        $form->addMultipleFileUpload("upload", "");
        //->addRule("MultipleFileUpload\MultipleFileUpload::validateFilled","Musíte odeslat alespoň jeden soubor!")
        //->addRule("MultipleFileUpload\MultipleFileUpload::validateFileSize","Soubory jsou dohromady moc veliké!",100*1024);


        $form->addSubmit("odeslat", "Odeslat");

        // setup form rendering
        $renderer = $form->getRenderer();
        $renderer->wrappers['controls']['container'] = NULL;
        $renderer->wrappers['pair']['container'] = 'div class=form-group';
        $renderer->wrappers['pair']['.error'] = 'has-error';
        $renderer->wrappers['control']['container'] = 'div class=col-sm-12';
        $renderer->wrappers['label']['container'] = 'div class="col-sm-0 control-label"';
        $renderer->wrappers['control']['description'] = 'span class=help-block';
        $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';

        // make form and controls compatible with Twitter Bootstrap
        $form->getElementPrototype()->class('form-horizontal');

        foreach ($form->getControls() as $control) {

            if ($control instanceof Controls\Button) {
                $control->getControlPrototype()->addClass('btn btn-success');


            } elseif ($control instanceof Controls\TextBase || $control instanceof Controls\SelectBox || $control instanceof Controls\MultiSelectBox) {
                $control->getControlPrototype()->addClass('form-control');

            } elseif ($control instanceof Controls\Checkbox || $control instanceof Controls\CheckboxList || $control instanceof Controls\RadioList) {
                $control->getSeparatorPrototype()->setName('div')->addClass($control->getControlPrototype()->type);
            }
        }

        // Invalidace snippetů
        //$form->onError[] = $this->handleRedrawUploadForm;
        $form->onSuccess[] = $this->uploadFormSucceeded;

        return $form;
    }

    /**
     * Zpracování Uploadu Fotek
     * @param $form Form
     */
    public function uploadFormSucceeded($form)
    {
        $galId = $this->getParameter('galId');
        $galleryDir = $this->$galleryDir .DIRECTORY_SEPARATOR.'galerie'.DIRECTORY_SEPARATOR. $galId;

        $values = $form->getValues();
        $files = $values['upload'];

        if (!empty($files) && !is_dir($galleryDir)) {
            mkdir($galleryDir, 0755, true);
            mkdir($galleryDir . '/thumb', 0755, true);
        }

        //uložit soubory (před uložením zmenšít na nějakou max velikost
        // _Max_Width_ a _Max_Height_


        foreach ($files as $file) {
            /**
             * @var $file \Nette\Http\FileUpload
             */

            if ($file->isImage()) {
                $image = Image::fromFile($file->getTemporaryFile());
                $image->resize(self::_Max_Width_, self::_Max_Height);
                $image->save($galleryDir . '/' . $file->getSanitizedName());

                /**
                 * Uložit do databáze
                 */

                $this->database->table('photos')->insert(array(
                    "gallery_id" => $galId,
                    "imgName" => $file->getSanitizedName(),
                ));

                /**
                 * vytvořit nahledy
                 */

                $image->resize(self::_Thumb_Size_, self::_Thumb_Size_);
                $image->save($galleryDir . '/thumb/' . $file->getSanitizedName());

            }

        }
        $this->flashMessage('Fotografie byly úspěšně nahrány', 'alert alert-success');
        $this->handleRedrawUploadForm();

    }

osobně si myslím, že používat přímo v kódu .png není dobré, navíc v tvém kódu netestuješ jestli to je či není obrázek. Pokud chceš pak jen .png měl bys to také nějak testovat a případně vyhodit chybovou hlášku.

Editoval ondraondra81 (15. 4. 2015 7:52)

koubi
Člen | 47
+
0
-

Moc děkuji a jen se zeptám, v čem byla chyba, v mém kódu? :)

petr.jirous
Člen | 128
+
0
-

Nebylo by lepší to použít takto?

if($file->isImage()) {
	$image = $file->toImage();
	...
}