Dynamické přistupování k obrázkům přes php skript
- krcuk41
- Člen | 12
Dynamické přistupování k obrázkům přes php skript
Ahoj,
řeším problém se zobrazením obrázků, které jsou ve složce, která je z webu nepřístupná. V podstatě se jedná o to aby uživatel viděl a mohl přistoupit pouze k obrázkům, které mu patří. Napadlo mě několik možností jak to vyřešit:
- Uložené obrázky načíst v php a vygenerovat HTML s base64 obrázkem
- Mít presenter, který bude zpracovávat požadavky na obrázky a bude je vracet
- Samostatný php skript, který je bude vracet
Vyzkoušel jsem první variantu a narazil jsem na problém s velikostí souboru. Narovinu, to načítání bylo pro velké obrázky pomalé a to generování obrázků taky nebyla rychlovka.
U druhé varianty mi příjde zbytečné pro každý obrázek startovat nette. Třetí možnost mi příjde nejlepší ale nevím jak autentizovat a autorizovat uživatele z nette v samostatném php skriptu a vůbec jak to celkově řešit.
Budu rád, když mi někdo poradí jak na to, nebo mě posune dál. Třeba už toto někdo řešil.
Díky všem co zareagují.
- her-ur
- Člen | 20
Podívej se na hlavičky X-Accel-Redirect
(nginx) a
X-Sendfile
(apache), viz např. http://stackoverflow.com/…pport-in-php
Můžeš pak použít možnost 3.
- her-ur
- Člen | 20
Pokud použiju X-Sendfile jakým způsobem následně ověřím nette usera a napříkal jeho roli v samostatném skriptu?
To už je čistě na tobě. Výhoda je v tom, že soubor pak posílá „napřímo“ webserver a získáváš tak možnosti cachování na úrovni webserveru, apod.
Pokud má někdo nějaké lepší řešení, tak se také rád poučím.
- CZechBoY
- Člen | 3608
Já šel variantou 2. Akorát já jsem se s tím moc nepáral a udělal jsem to jako klasický (potomek UI\Presenter) presenter. Lepší by určitě bylo podědit MicroPresenter nebo vytvořit nový presenter implementující IPresenter po svém.
Myslim si, že ty hlavičky můžeš použít ikdyž použiješ Nette.
Editoval CZechBoY (30. 1. 2017 10:30)
- Svaťa Šimara
- Člen | 98
@krcuk41 Jak píšeš – startovat na každý obrázek Nette je nesmysl. Ale pokud potřebuješ autentizaci z Nette, tak se z Nette něco použít bude muset. Co je v Nette snad nejpomalejší? Presenter + Router, toho je dobré se zbavit.
Můžeš si vytvořit DI kontejner, a z něj se pokusit vytáhnout autorizovaného uživatele… a to je vlastně celé.
Pokud nevíš, jak na to, tak jde v podstatě o to vykuchat většinu bootstrap.php a na závěr nespouštět Nette aplikaci, ale servírovat uživateli obrázek. Tím Ti vznikne .php script, takže vlastně Tvá 3. možnost.
Teda doufám, že tento způsob bude fungovat, nezkoušel jsem pro práci s uživatelem :-)
- krcuk41
- Člen | 12
Svaťa Šimara napsal(a):
@krcuk41 Jak píšeš – startovat na každý obrázek Nette je nesmysl. Ale pokud potřebuješ autentizaci z Nette, tak se z Nette něco použít bude muset. Co je v Nette snad nejpomalejší? Presenter + Router, toho je dobré se zbavit.
Můžeš si vytvořit DI kontejner, a z něj se pokusit vytáhnout autorizovaného uživatele… a to je vlastně celé.
Pokud nevíš, jak na to, tak jde v podstatě o to vykuchat většinu bootstrap.php a na závěr nespouštět Nette aplikaci, ale servírovat uživateli obrázek. Tím Ti vznikne .php script, takže vlastně Tvá 3. možnost.
Teda doufám, že tento způsob bude fungovat, nezkoušel jsem pro práci s uživatelem :-)
Myslíš, že bys mi mohl ukázat co a jak a popstrčit mě? Díky.
- her-ur
- Člen | 20
V index.php máš pravděpodobně toto:
$container = require __DIR__ . '/../app/bootstrap.php';
$container
je instance DI containeru
a z něj se můžeš vytahat ty služby, které potřebuješ, např:
$service = $container->getByType('App\Some\Service');
Tohle si dáš třeba do souboru file.php, který budeš volat.
- Martk
- Člen | 661
Ještě můžeš použít mikro presenter, je to odlehčená verze presenteru, takže to bude frčet o něco rychleji, ale ne tak jako bod 3 nebo rada od Sváti Šimary. Příklad užití
- Svaťa Šimara
- Člen | 98
A když nad tím přemýšlím, tak je nejspíš zbytečně náročné sestavovat celý kontejner pro každý obrázek. Představím si, že je na stránce 50 obrázků = 50× spuštěný script, 50× vytváření objektu kontejneru, no neefektivita nad neefektivity :-/
Takže toto řešení bych bral jako první verzi. Ve druhé ještě odlehčenější verzi bych zkusil pracovat bez Nette, přímo se $_SESSION, třeba to bude stačit :-) Anebo bych si sestavil konfiguraci pro DI kontejner přímo pro toto použití – pro obrázky. Takový DI kontejner by obsahoval jenom práci se session, uživatele, autentizaci, autorizaci a snad nic víc :-)
- her-ur
- Člen | 20
A když nad tím přemýšlím, tak je nejspíš zbytečně náročné sestavovat celý kontejner pro každý obrázek. Představím si, že je na stránce 50 obrázků = 50× spuštěný script, 50× vytváření objektu kontejneru, no neefektivita nad neefektivity :-/
Kontejner se ale sestaví pouze při prvním spuštění aplikace. Pak už to je jen o vytvoření instance kontejneru, ne?
- Svaťa Šimara
- Člen | 98
@her-ur Ano, vytváří se „pouze“ instance kontejneru. Což znamená načíst pár kB-MB soubor, projet ho PHPčkem, vytvořit instanci. A proč? Jenom abych vytáhl něco ze session.
Ano, a u rozsáhlého projektu může být kontejner obrovský :-(
- akadlec
- Člen | 1326
S tím servírováním přes micropresenter si trošku ohřeju polívčičku Sice se tam neřeší ověření uživatle ale nic co by nešlo dodělat.