File download – oncomplete > neproběhne

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lopikol
Začátečník | 75
+
0
-

Presenter:

<?php
public function actionDownload($fileId)
{
        // získání informací o souboru z databáze
        $this->file = DownloadsModel::findOne(array('id' => $fileId));

        // stažení
        $download = new FileDownload;
        $download->sourceFile = FILEDOWNLOAD . $this->file->file . '.' . $this->file->suffix; // cesta k souboru
        $download->onComplete[] = array($this, 'FileDownloadComplete');
        $download->download();

        // ukončení scriptu
        $this->terminate();
}

protected function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
{
        // získám aktuální informace o souboru
        $file = DownloadsModel::findOne(array('id' => $this->file->id));

        // přidám stažení
        $file->downloads += 1;

        // uložím
        $this->DownloadsModel->save($file);
}
?>

Model:

<?php
    public static function save($file)
    {
        return dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file);
    }
?>

Stažení souboru proběhne, ale nepřidá se mi +1 k download (počet stažení)

Nox
Člen | 378
+
0
-

nepřidá = funkce save() se nepustí nebo FileDownloadComplete se nepustí nebo query se nepovede?

query předáváš celý objekt, je to správně? nemělo by tam být něco jako ' WHERE id=%i', $file->getId());' ?

lopikol
Začátečník | 75
+
0
-

řekl bych, že se FileDownloadComplete vůbec nepustí, jelikož ikdyž do něj napíšu blbost, tak se soubor stáhne a žádná chyba nevyskočí.

Honza Kuchař
Člen | 1662
+
0
-

pozor, při odesílání souborů, se nevypisují chyby! Také mě to překvapilo.

Honza Kuchař
Člen | 1662
+
0
-

zkus si do té metody dát jen něco na styl file_put_content(…); Ať vyzkoušíš, jestli to běží.

Případně použij debuger

lopikol
Začátečník | 75
+
0
-

Tak jsem tam hodil file_put_content(…); jak si řekl a nic stáhne se to a tot vše > vůbec se to nespustí.

lopikol
Začátečník | 75
+
0
-

Honza Kuchař: Nevěděl by si prosím co stim je. Myslím si, že si ten nejoprávněnější, když je to tvůj addon.
Pokud je to onComplete nefunkční, tak pak celý addon pro mne ztrácí smysl :(, jelikož bych mohl rovnou házet link. Rád bych měl přehled o počtu stažení.

Editoval lopikol (15. 1. 2011 13:15)

Solution
Člen | 50
+
0
-

Vždyt ty do té query předáváš objekt, tak jak ti z toho má dibi extrahovat int?
Snad:

<?php
 public static function save($file)
    {
         dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file->id);
    }
?>

Pokud se mýlím, tak přidej do toho callbacku:

<?php
	Debug::barDump(__METHOD__);
?>

A hned uvidíš v debug panelu, jestli se volá nebo ne.

lopikol
Začátečník | 75
+
0
-

Padik: tak jsem to udělal tak jak řikáš. Soubor se normálně stáhne, ale nikde nic, žádná chyba, error, zpráva…

Solution
Člen | 50
+
0
-

Omg, Já jsem vůl:

<?php
protected function FileDownloadComplete(FileDownload $download,IDownloader $downloader) //Místo toho:
public function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
?>

BTW: Proč v té fci máš takové quanta kodu navíc?

<?php
public function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
{
        // uložím
        $this->DownloadsModel->save($this->file->id);
}

 public static function save($file)
 {
         dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file);
 }
?>

Tohle je přirozenější :-P.

lopikol
Začátečník | 75
+
0
-

Padik: Upraveno, ale at dělám co dělám, tak se asi onComplete prostě neprovede.

Solution
Člen | 50
+
0
-

Uff, už mě nic nenapadá, zkus mi sem hodit verzi php a fd, já se na to podívám, až bude chvíle na localu.
Ještě mě tak napadlo, zkus odstranit to:

<?php
	$this->terminate();
?>

Jen na zkoušku.

lopikol
Začátečník | 75
+
0
-

Odstaněno > beze změny.

Apache2.2
php-5.3.5
MySQL Server 5.5

Tak už to mám. Problém je v onComplete. Ostaní callbacky fungují jak mají.
Vyřešil jsem zapsaní do db (+ odebraní) použitím onBeforeDownloaderStarts a onAbort
Mohl bych tě proím poprosit o jedno vysvětlení?

<?php
DownloadsModel::save($this->file->id);
//vs.
$this->DownloadsModel->save($this->file->id); // toto vždy skončí s Cannot read an undeclared property
?>

Jaký je vnich rozdíl?

Editoval lopikol (15. 1. 2011 20:42)

Matúš Matula
Člen | 257
+
0
-

DownloadsModel je trieda s metodou save, preto 1.pripad funguje.
V 2.pripade sa snazis pristupit k nedeklarovanej property presenteru s nazvom DownloadsModel, ako vidno aj z hlasky ;)

Honza Kuchař
Člen | 1662
+
0
-

Mrknu na to, ale teď máme pololetí, tak fakt nemám čas.

Ale mám jedno upozornění. Nevím přesně jak to je, ale setkal jsem se s tím, že se při odesílání souboru tímto způsobem nevypisují chyby. Tedy pokud vyvolám chybu po stažení souboru, tak smůla. Nevypíše do výstupu. Myslím, že Nette\Debug to bere, ale klasické hlášky PHPka, fakticky nefungují.

Honza Kuchař
Člen | 1662
+
0
-

PS: Díval jsem se, jestli funguje ten příklad z distribuce. Konkrétně form. A funguje.
Callbacky se mi zavolají v tomto pořadí:

Con. #1295173892-16387 (Completed)
5: onComplete: 1 MB <->; position: 1 MB; http-range: 0 B-1024 kB; progress (con: 100% X file: 100%)
4: onStatusChange: 1 MB <->; position: 1 MB; http-range: 0 B-1024 kB; progress (con: 100% X file: 100%)
3: onStatusChange: 512 kB <->; position: 512 kB; http-range: 0 B-1024 kB; progress (con: 50% X file: 50%)
2: onNewTransferStart: 0 B <->; position: 0 B; http-range: 0 B-1024 kB; progress (con: 0% X file: 0%)
1: onBeforeOutputStarts: 0 B <->; position: 0 B; http-range: 0 B-1024 kB; progress (con: 0% X file: 0%)
0: onBeforeDownloaderStarts: 0 B <->; 
klimax
Člen | 7
+
0
-

měl jsem podobný problém, který není vyřešen na php 5.2 nette 0.9.7
onComplete se mi nevolal,v BaseFileDownload jsem zakomentoval řádek 541

<?php
die(); // If all gone ok -> die
?>

a už mi onComplete fce funguje

každopádně mám jednu otázku, nefunguje mi volání flashMessage

<?php
public function onFileDownloadConnectionLost(FileDownload $download, IDownloader $downloader) {
        $this->flashMessage('Spadlo spojení, stáhněte soubor znovu', 'error');
    }
?>

chtěl bych uživatele upozorňovat, že se něco děje

Editoval klimax (17. 1. 2011 9:26)

lopikol
Začátečník | 75
+
0
-

Klimax: Díky to je ono :)

Aurielle
Člen | 1281
+
0
-

Musel bys přesměrovat, aby se flash zprávička zobrazila.

klimax
Člen | 7
+
0
-

gmvasek napsal(a):

Musel bys přesměrovat, aby se flash zprávička zobrazila.

ano, to mi funguje napriklad v callbacku onBeforeDownloaderStarts

<?php
 public function onBeforeDownloadStarts($file, IDownloader $downloader) {
        $this->flashMessage('Soubor byl úspěšně stažen', 'success');
	$this->redirect('Directive:');
    }
?>

tim redirectem se mi ale samozrejmne soubor nestahne.

ale uz nefunguje v onComplete, tam mi funguje pouze nevizualni volani :(

idelani predstava, behem procesu bych do flashmessage daval hlasky a pri onComplete bych redirectoval a vsechny hlasky vypsal

Honza Kuchař
Člen | 1662
+
0
-

Nene, FileDownloader zablokuje sessions. Dá se to tuším někde vypnout, ale nedoporučuji to. Více zde: https://forum.nette.org/…iewtopic.php?…