Je rozdíl mezi localhostem a ostrým serverem při dowloadu souboru?

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

Ahoj, mám problém, který nechápu.

Na lokálním serveru mi vše funguje jak má, ale na ostrém serveru se vyhodí vyjímka.

Jde o tuto záležitost.
Automaticky vygeneruju soubor, který nabídnu ke stažení/zobrazení.
Děje se to přes URL

"?fileName=export.ini&dir=export&action=download"

kde actionDownload je definovaná v BasePresenteru, odkud dědí všechny presentery a vypadá takto:

<?php
public function actionDownload($fileName,$dir = "")
    {
        if ($dir != "")
            $dir .= "/";
        $this->getAttachment($dir.$fileName);
    }
?>

V presenteru, ve kterém generuji soubor pak volám

<?php
$this->redirect('download',$zip_file,"export");
?>

Nechápu, kde je problém, protože aplikace nedojde ani k funkci actionDownload a zahlásí, že stránka neexistuje, přičemž stejný kód na lokálním serveru funguje…

Lokál: WinXP + WAMP, PHP 5.3.0

Ostrý: Debian Lenny, PHP 5.3.2–0.dotdeb.2

Edit:
Ještě bych měl dodat, že se soubor vždy vygeneruje a to na obou strojích, jen nedojde k akci Download. Je problém ve volání redirectu?

Editoval worsik (7. 6. 2010 10:15)

h4kuna
Backer | 740
+
0
-
  1. rekl bych ze toto neni dobre reseni do url davat cestu k souboru pac mu muzes podstrcit neco jineho (pak uz zalezi jak jsou nastaveny prava na serveru)
  2. jmeno souboru ano, ale nekde mej ulozenou cestu k souboru, pokud mas vsechny v jedne slozce tak v poho, jinak… (vyresit)
  3. nebo kontroluj cestu zda je v ramci document_root
  4. to presmerovani tezko rict si pust routing debugger a mrkni ktera roura to chyta a kam to putuje dal
worsik
Člen | 40
+
0
-

matata napsal(a):

  1. rekl bych ze toto neni dobre reseni do url davat cestu k souboru pac mu muzes podstrcit neco jineho (pak uz zalezi jak jsou nastaveny prava na serveru)
  2. jmeno souboru ano, ale nekde mej ulozenou cestu k souboru, pokud mas vsechny v jedne slozce tak v poho, jinak… (vyresit)
  3. nebo kontroluj cestu zda je v ramci document_root
  4. to presmerovani tezko rict si pust routing debugger a mrkni ktera roura to chyta a kam to putuje dal

ad 1) Cestu k souborům mám definovanou v config.ini, pouze v tom adresáři mám ještě složku pro export, pak tedy rozlišuju, jestli jde do složky nebo nejde. Podstrčit cestu tedy můžu, ale na té cestě nic nebude :o)
Práva na serveru mám kompletní, nastavení chmod 777

ad 3) složka se soubory je mimo document_root, tedy mimo dosah uživatelů

ad 4) bohužel routing debugger mi hlásí, ale stránka chcípne dříve a debugger se nezobrazí :o(

Díky za rady, musím vyzkoušet něco jiného.

worsik
Člen | 40
+
0
-

Tak celý den pátrám, kde může být chyba a jediné co jsem našel je tohle:

Pokud metoda obsahuje

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

, pak redirect na ni selže.

Tuto metodu jsem převzal z tohoto fóra s mírnou úpravou a na lokálu mi bezvadně fungoval

<?php
    /**
     * Show "download dialog" in browser for required file
     * @param  string
     * @return void
     */
    final public function getAttachment($name)
    {
        try {
            $file = array(
            'fileName' => $name,
            'realName' => FILE_DIR .'/'. $name,
            'fileSize' => filesize(FILE_DIR .'/'. $name),
            );
            $type = '';
            if(extension_loaded('fileinfo'))
            {
                $type = finfo_file(finfo_open(FILEINFO_MIME),$file['realName']);
                if (strchr($type,';'))
                    $type = strstr($type,';',true);
            }
            if ($type == '')
                $type = 'application/octet-stream';

            $httpResponse = Environment::getHttpResponse();
            $httpResponse->setContentType($type);
            $httpResponse->setHeader('Content-Description', 'File Transfer');
            $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $file['fileName'] . '"');
            $httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
            $httpResponse->setHeader('Expires', '0');
            $httpResponse->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
            $httpResponse->setHeader('Pragma', 'public');
            $httpResponse->setHeader('Content-Length', $file['fileSize']);
            ob_clean();
            flush();
            readfile($file['realName']);

        } catch (InvalidStateException $e) {
            throw new BadRequestException($e->getMessage());
        }
        catch (Exception $f)
        {
            throw new ApplicationException("Chyba při downloadu souboru, {$f->getMessage()}");
        }
        $this->terminate();
    }
?>

Pls, už mám pocit, že jsem se koukal všude, co bych měl zkontrolovat v nastavení serveru?

worsik
Člen | 40
+
0
-

uff, done, po lítém boji a díky TextDiff v PSPadu jsem porovnal oba php.ini soubory a nejspíš jedna z direktiv zabrala :-D

Předpokládám, že to byla tato

output_buffering = On
Honza Kuchař
Člen | 1662
+
0
-

Nemusíš se s tím mastit ručně, na špinavou práci je tu FileDownloader z doplňků.