Autor Zpráva
piiiiiiiip
Profil
Dobrý den. Na localhostu jsem si udělal v nette upload obrázku. Na localhostu mi to funguje ale když jsem to nahrál na hosting tak to fungovat přestalo.
  foreach ($values['foto'] as $ffoto)
        {
            if ($ffoto->isOk()){
             
                $filename = $ffoto->getSanitizedName();
                $filename = $filename;
                $targetPath = 'http://aaaaaa.cz/temp/imgs';
                $image = Image::fromFile("$targetPath/$filename");
                $logoname = "$filename";
                $image->save('http://aaaaaa.cz/temp/imgs/file_' . $logoname);
                $simage = 'http://aaaaaa.cz/temp/imgs/file_' . $logoname;

            }
V logu mám tohle.
<div id="tracy-bs-error" class="panel">
            <p>Nette\Utils\UnknownImageFileException</p>

            <h1><span>File '/obrazek.jpg' not found.</span>
            <a href="https://www.google.com/search?sourceid=tracy&amp;q=Nette%5CUtils%5CUnknownImageFileException+File++not+found." target="_blank" rel="noreferrer noopener">search►</a>
            </h1>
        </div>

Myslím si že je to špatně nastavenou cestou k úložišti ale nejsem si tím jistý a zkoušel jsem to opravit už přez dvě hodiny bez úspěchu takže to tím být nemusí.
Keeehi
Profil
http://aaaaaa.cz/temp/imgs opravdu správná cesta nebude. Zkusil bych temp/imgs, případně ../temp/imgs nebo něco takového. Záleží, kde ve struktuře je ten tvůj script, ale základem je mít tu cestu relativní.

Řádek 6 a 11 je zbytečný a 9 je taky téměř k ničemu.
piiiiiiiip
Profil
Keeehi:
UploadPresenter mám v app/CoreModule/presenters což znamená že správná cesta by měla tedy být
$image->save('../../../temp/imgs/file_' . $logoname);
nebo
$image->save('/../../../temp/imgs/file_' . $logoname);
že? Jenže to taky nefunguje.
Keeehi
Profil
Ta druhá určitě ne. To lomítko na začátku označuje absolutní cestu od kořene.
Kde aktuálně script je zjistíš pomocí echo getcwd() . "\n";
piiiiiiiip
Profil
Keeehi:
To mi vrátilo tohle:
/var/www/vhosts/aaaaaa.cz/httpsdocs/www
Keeehi
Profil
Takže viděl bych to takto nějak. Vytvářet z toho obrázek, jen proto abys to uložil je zbytečnost. Kdyby jsi ho před uložením chtěl zmenšit, tak ok, ale takto to není potřeba.
    foreach ($values['foto'] as $ffoto) {
        if ($ffoto->isOk()) {
            $ffoto->move('../temp/imgs/file_' . $ffoto->getSanitizedName());
        }
    }
piiiiiiiip
Profil
Původně jsem ho zmenšovat chtěl ale nakonec jsem si to rozmyslel. Toto řešení funguje. Děkuji za pomoc.
piiiiiiiip
Profil
Ještě se chci zeptat zda se dá v nette formulář odeslat automaticky za použití js, něco jako tohle:
        
        xhr.open("post", "upload/upload.php", true);
        
        // Set appropriate headers
        xhr.setRequestHeader("Content-Type", "multipart/form-data");
        xhr.setRequestHeader("X-File-Name", file.name);
        xhr.setRequestHeader("X-File-Size", file.size);
        xhr.setRequestHeader("X-File-Type", file.type);

        // Send the file (doh)
        xhr.send(file);
Keeehi
Profil
piiiiiiiip:
Jedna věc je odeslání formuláře javascriptem a druhá je odeslání na pozadí AJAXem. O co ti tedy jde?
piiiiiiiip
Profil
Vzhledem k tomu že se u tohoto formuláře jedná pouze o upload obzázků mi přijde zbytečné dávat tam ještě tlačítko pro odesílání formuláře a tak bych chtěl aby se ty obrázky uploudovaly automaticky.
Keeehi:
Co bude jednodušší. Ten kod co jsem uvedl výše (našel jsem ho někde na googlu) by měl provést ten upload přez upload.php. Upload.php bude v mé nette aplikaci UploadPresenter.php a takže jestly to chápu správně tak potřebuji aby
  xhr.open("post", "upload/upload.php", true);
Byl signál (nevím jestly je v nette na toto nějaká speciální funkce) který dokáže předat data z formuláře do presentru který je uploaduje.
Keeehi
Profil
Na automatické odeslání formuláře po výběru souboru se dá použít i tento jednoduchý JS
document.getElementById("file").onchange = function() {
    document.getElementById("form").submit();
};

Jinak tlačítko bys tam měl mít v každém případě. To kdyby náhodou javascript nefungoval. Můžeš ho pak ale javascriptem skrýt.

Mám ale takovou otázku, co když se člověk při výběru souboru překlikne a bude chtít svůj výběr změnit? To už nepůjde, jelikož jeho původní výběr okamžitě odesíláš. Já bych to ruční odesílání zase tak úplně nezatracoval.
piiiiiiiip
Profil
Keeehi:
No, jo. To mě nenapadlo xD.
piiiiiiiip
Profil
Keeehi:
Dobře takže tet už dokážu uploadovat soubory pomocí tlačítka. Ještě bych to ale chtěl udělat i pomocí draganddrop. Mám js, který udělá z tagu p tu dropareu ale opět nevím jak to propojit s nette tak aby se soubor nahrál. Na googlu jsem zjistil že se to nejspíš dělá pomocí HTTP request & response ale nevím jak to implementovat.
Keeehi
Profil
Drag & Drop upload obrázků
piiiiiiiip
Profil
Keeehi:
Ano to mám. Nevím ale jak předat data do presenteru který má soubor uložit.
Zechy
Profil
piiiiiiiip:
Pokdu budeme vycházet z toho příkladu, kdy se přes XHR otvírá POST request na nějakou stránku, tak místo "upload.php" můžeš jako parametr dát {link Presenter:Action}.
piiiiiiiip
Profil
Zechy:
Používám toto:
document.getElementById("frm-myForm").submit();
Myslím že problém je v tom že
<p id="drop-area">
není součástí toho formuláře. Potřebuju tedy asi nějak vytvořit políčko ve formuláři které bude ta droparea aby se mi to odeslalo pomocí submit víše.
Zechy
Profil
piiiiiiiip:
Nevím, jaký JavaScript máš, a jak to dělá... Ale při přetažení by měl file input získat referenci na něj. Pak si v klidu formulář odešleš a v datech formuláře máš i nahrávaný soubor.

Případně pokud ti stačí hotové řešení, můžeš vyzkoušet jQuery-FileUpload. Ten už v základu nahrává ajaxem a umí i dropzone.
piiiiiiiip
Profil
Zechy:
Používám tohle:
robertnyman.com/html5/fileapi-upload/fileapi-upload.html

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: