Je rozdíl mezi localhostem a ostrým serverem při dowloadu souboru?
- worsik
- Člen | 40
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
- 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)
- jmeno souboru ano, ale nekde mej ulozenou cestu k souboru, pokud mas vsechny v jedne slozce tak v poho, jinak… (vyresit)
- nebo kontroluj cestu zda je v ramci document_root
- to presmerovani tezko rict si pust routing debugger a mrkni ktera roura to chyta a kam to putuje dal
- worsik
- Člen | 40
matata napsal(a):
- 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)
- jmeno souboru ano, ale nekde mej ulozenou cestu k souboru, pokud mas vsechny v jedne slozce tak v poho, jinak… (vyresit)
- nebo kontroluj cestu zda je v ramci document_root
- 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
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?
- Honza Kuchař
- Člen | 1662
Nemusíš se s tím mastit ručně, na špinavou práci je tu FileDownloader z doplňků.