Dynamické přistupování k obrázkům přes php skript

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

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:

  1. Uložené obrázky načíst v php a vygenerovat HTML s base64 obrázkem
  2. Mít presenter, který bude zpracovávat požadavky na obrázky a bude je vracet
  3. 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
+
+1
-

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.

krcuk41
Člen | 12
+
0
-

Pokud použiju X-Sendfile jakým způsobem následně ověřím nette usera a napříkal jeho roli v samostatném skriptu?

Jak moc velký rozdíl by byl mezi 2. a 3. možností?

Díky.

Editoval krcuk41 (30. 1. 2017 10:25)

her-ur
Člen | 20
+
0
-

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
+
0
-

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)

krcuk41
Člen | 12
+
0
-

Já osobně bych byl radši kdybych mohl použít možnost 2. ale nebude narůstat časová náročnost při dotazování přes nette?

Svaťa Šimara
Člen | 98
+
+2
-

@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
+
0
-

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
+
+2
-

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
+
0
-

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
+
-1
-

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
+
0
-

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
+
0
-

@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
+
0
-

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.