Maskování cesty k souborům
- lukyn_94
- Člen | 12
Dobrý den , chtěl bych poprosit a zeptat se jakou metodou se dá maskovat cesta k souborů mám namysli www.stranka.cz/…kysoubor.png → www.stranka.cz/file/token z db a jestli to je efektivní aby to nebylo zbytečný jesti přes zdroják stránky nezjistí reálnou cestu ? Děkuji všem za každou radu .
- Gappa
- Nette Blogger | 209
V principu se to většinou dělá tak, že nějaká url (např.
example.com/download/123
) po splnění podmínek (přihlášený,
správná práva atp.) načte obsah souboru do paměti a pak ho okamžitě
odešle na výstup do prohlížeče, který obsah zobrazí/stáhne (podle
hlaviček).
Tohle řešení ale přestává být vhodné, pokud má jít např. o streamování videa nebo obecně velké soubory, to lze řešit třeba pomocí mod_auth_token.
Určitě ale bude existovat ještě nějaké jiné řešení :)
- David Matějka
- Moderator | 6445
pro snadne odeslani velkeho souboru skrz php je nejlepsi readfile, ktere je setrne k pameti
- Felix
- Nette Core | 1247
Nedavno jsem objevil (do ted se za to stydim). Ze existuji specialni hlavicky pro odesilani souboru.
Napr. pro Apache je to X-Sendfile
.
Snippet z nejake ukazky (ne moje) [https://tn123.org/mod_xsendfile/].
<?php
...
if ($user->isLoggedIn())
{
header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;
}
?>
<h1>Permission denied</h1>
<p>Login first!</p>
Principialne jde o to, ze jenom webserveru reknes, jakej soubor ma za tebe odeslat. A on ho nacte. PHP tak nezdrzuje, ale je to v rezii webserveru.
Pro ruzne webservery jsou ty hlavicky ruzne, tak bacha na to.
Editoval Felix (30. 8. 2018 16:07)
- Petr Parolek
- Člen | 455
Ahoj, já používám:
<?php
public function actionDownloadPdf($id)
{
$document = $this->idocumentsRepository->getInvoice($this->user->id, $id);
if (!$document) {
$this->error("Dokument nebyl nalezen!");
}
$file_path = realpath(__DIR__ . "/../../www") . "/" . $document->getPdfUrl();
$file_content = @file_get_contents($file_path);
$httpResponse = $this->context->getByType('Nette\Http\Response');
$httpResponse->setHeader('Content-type', 'application/pdf');
$httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . basename($file_path) . '"');
$httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
$httpResponse->setHeader('Content-Length', filesize($file_path));
$httpResponse->setHeader('Accept-Ranges', 'bytes');
$this->sendResponse(new Nette\Application\Responses\TextResponse($file_content));
}
?>