Autor | Zpráva | ||
---|---|---|---|
danhill Profil |
Ahoj,
zkouším a snažím se pochopit jak se pracuje s obrázky uloženými v databázi. Ale mám pár nejasností, kterým úplně jako nerozumím, tak se jdu zkusit zeptat chytřejších. Problém mám s odkazem jako takovým a odkazem pro stažení obrázku v původní velikosti. Mám tabulku: id(INT,AI), image(MEDIUMBLOB) a image_name(varchar (64)) Do ní vložím obrázky z formuláře: $img = addslashes(file_get_contents($_FILES['image']['tmp_name'])); $img_name = addslashes($_FILES['image']['name']); $mysqli->query("INSERT INTO `test` (`image`, `image_name`) VALUES ('$img', '$img_name')"); Normálně si vypíšu obrázky z databáze: $images = $mysqli->query("SELECT * FROM `test` "); A pak si zobrazím něco jako náhledy: foreach ($images AS $image){ echo $image['image_name'].'</br>'; echo '<img src="data:image/jpeg;base64,'.base64_encode($image['image']).'" width="100" height="100"></br>'; } 1. má cenu se tímto vůbec zabývat? Nebo je lepší pracovat s fotkami a obrázky normálně tak,že se ukládají někde do složky v rootu webu a ne do databáze? jestliže to smysl má, pak prosím: 1. mi uniká,jak udělám buď aby náhled byl klicací a po kliknutí se stáhnul do PC originál obrázku z db nebo se otevřel v původodní velikosti, nebo jak bych udělal tlačítko pro stažení obrázku ... 2. sekce: data:image/jpeg ??? to jpeg musí být proměnné,ne? Co když nahraju třeba png? 3. lze nějak vytvořit rozumný link na takový obrázek? Protože za současného stavu je link složen vpodstatě z těch binárních dat obrázku a to je teda jako dobrá šílenost :) PS: tohle je jen příklad, samozřejmě zde není zohledněna práce s velikostmi obrázků,náhledů atd ... |
||
Nuimi Profil |
#2 · Zasláno: 27. 9. 2016, 09:11:51
Ahoj,
je mi jasny ze spousta tech profesionalnich programatoru mi to pekne zkritizuje, ale pokud mas nejakej server, tak je podle me lepsi nahrat obrazky do nejake slozky. K tomu pouzijes uploudovaci script, v kterym pridas ze pred nahranim do slozky se ti prida radek do databaze. $pridej="Update db SET jmeno='libovolne jmeno', cesta='cesta k danemu obrazku'"; Dale u vypisu pouzijes Light box, aby to nejak vypadalo, pokud nemas vlastni zpusob zobrazeni. $obrazky="SELECT cesta FROM db "; $ukaz=$db->query($obrazky); define ("COLS", 5); echo ("<table>"); for ($i = 0; $row=$ukaz->fetch_assoc(); $i++) { if($i % COLS == 0) { echo ("<tr>"); } echo ('<td width="205" height="205"> <a class="example-image-link" href="'.$row['cesta'].'" data-lightbox="example-set" > <img class="img-thumbnail" class="example-image" src="'.$row['cesta'].'" alt="" width="200" height="200"/> </a> </td>'); if ($i % COLS == COLS - 1) { echo ("</tr>"); } } if ($i % COLS != 0) { while ($i++ % COLS != 0) { echo("<td> </td>"); } echo ("</tr>"); } echo ("</table>"); |
||
danhill Profil |
#3 · Zasláno: 27. 9. 2016, 09:53:28
Ano ano je mi v podstatě jedno, jestli budu mít obrázky v databázi,nebo na serveru ...
Vlastně tu funkci, že lze obrázky nahrávat i do db jsem objevil a vyzkoušel až dnes :) ... Tak jsem hlavně nevěděl, jestli náhodou to není obecně jako lepší, ale zase jinak se s tím pracuje ... Děkuji za ten kod, jen mu moc nerozumím, obsahuje na mě příliš mnoho objektových prvků :D ... ???Tohle je jako foreach? $ukaz=$db->query($obrazky); ??? define ("COLS", 5); $i++ % COLS Díky moc. |
||
Bubák Profil |
danhill:
„2. sekce: data:image/jpeg ??? to jpeg musí být proměnné,ne? Co když nahraju třeba png?“ Prohlížeče obrázek i tak zobrazí, i když to bude třebas text/plain, ale je to prasárna a je s tím pár problémů, třeba při ukládání se obrázek uloží s nesprávnou příponou, v tomto případě .txt Živá ukázka Odkaz Ještě dodám, že pokud platí staré poučky, tak je lepší ukládat obrázky jako soubory. |
||
Nuimi Profil |
danhill:
nn neni to zadnej foreach, je to proste přiřazení dotazu. a celkove ten kod jedine co dela je ze vytvori tabulku tak aby se ty obrazky vypisovali do urciteho poctu sloupcu a radku Bubák: pokud to bude mim zpusobem tak nemusi, IMG src otevre jakykoli obrazkovy i gif formát |
||
Kajman Profil |
#6 · Zasláno: 27. 9. 2016, 15:44:37
Pokud mohou obrázky všichni vidět, mohou být na disku a může je obstarávat jen http server.
Pokud se mají zobrazovat jen někomu, je potřeba je vracet skriptem, který ověří práva. Zda je pak soubor na disku (nepřístupný s webu přímo) nebo v databázi nehraje příliš velkou roli. Větší soubory se lépe zálohují jinam při diskovém přístup (jednodušší ikrementální zálohy) než v databázi. PS. Pokud je budete dávat do databáze, tak nepoužívejte addslashes, ale metodu real_escape_string. |
||
danhill Profil |
#7 · Zasláno: 27. 9. 2016, 20:02:17
Děkuji za rady ...
A ano budu řešit, kdo může a kdo nemůže fotky vidět ... Určitě ne nepřihlášení uživatelé a nejspíše budu potřebovat i další podmínky ... Zatím jsem tak dalece nedošel,ale tohle jsem myslel,že asi vyřeším v samotném php který bude fotky zobrazovat na základě session a přístupu do daného indexu,ale teď mi asi dochází,že to nebude tak snadné ... že vlastně si fotku zobrazí kdokoli,kdo bude mít link na ten obrázek :o ... no to vlastně asi není uplně žádoucí :( ... chjo to zase bude pěkný porod, tohle rozchodit ... |
||
Alphard Profil |
#8 · Zasláno: 28. 9. 2016, 02:00:30
danhill:
„bude fotky zobrazovat na základě session a přístupu do daného indexu,ale teď mi asi dochází,že to nebude tak snadné“ Když se budou i fotky načítat načítat přes PHP script, může se ověřit session, to není problém. Jinak, ještě tady nepadlo, že zobrazovat galerii přes src=data může být problém, pokud jde o výkon. Výsledná stránka bude datově velká, ale zřejmě nebude cachovaná tolik jako typické statické soubory. V závislosti na struktuře html by problížeč mohl s vykreslování stránky čekat na načtení poslední fotky (ale to fakt nevím, jak se prohlížeče chovají v tomto).
|
||
Časová prodleva: 3 dny
|
|||
danhill Profil |
#9 · Zasláno: 30. 9. 2016, 19:10:29
No, stále mi to nějak uniká ... Když fotka bude ve složce dejme tomu "mujserver.cz/fotky/nazevfotky.jpg"
Jakým způsobem zajistím,aby když tuto adresu zadá někdo do prohlížeče se mu fotka nezobrazí? Myslíte to tak, že ve složce "fotky" vytvořím soubor index.php a tam dám nějakou podmínku něco jako "if (SESSION['userid']==FALSE) { header jinam} " nebo tak něco??? To ale na samotnou fotku nebude mít vliv,nebo se pletu? Spíše mě jako napadá varianta, kdy v php použiju GET nějakého hashe (třeba názvu obrázku) a pak tedy až samotný php bude znát skutečný link na fotku ... ale to stejně neřeší, že samotný link na fotku nebude funkční, když už ho někdo bude znát ... |
||
TomášK Profil |
#10 · Zasláno: 30. 9. 2016, 22:08:12
Fotka bude ve složce, ke které nemá webserver přístup. Uživatel ji získá tak, že přijde na mujserver.cz/fotky/nazevfotky.php. Pokud proběhne ověření uživatele v pořádku, přečte si skript obsah obrázku z disku a pošle ho uživateli. Vhodné hlavičky zajistí, že prohlížeč pozná, že jde o obrázek a ne HTML stránku. S vhodným nastavením je možné vykonat skript i pro požadavek mujserver.cz/fotky/nazevfotky.jpg, pokud by vadila 'ošklivá' přípona.
|
||
Časová prodleva: 9 dní
|
|||
danhill Profil |
#11 · Zasláno: 10. 10. 2016, 07:50:31
TomášK:
Aha. to zní dobře. Děkuji. Jen dvě otázky k tomu. 1.jak zakážu webserveru přístupu do složky? Pomocí .htaccess deny from all?? 2.uniká mi, nazevfotky.php - vždyť název bude pokaždé jiný, to mám mít pro každou fotku jedno php? To je asi nesmysl,ne? |
||
Keeehi Profil |
1 ano
2 stačí jeden script. Může se jmenovat třeba fotka.php a to kterou fotku má načíst můžeš určit třeba parametrem v URL. fotka.php?jmeno=jmeno-fotky.jpg |
||
Časová prodleva: 3 dny
|
|||
danhill Profil |
Aha ... Děkuji. Chápu ...
Jen pro doplnění ... tohle asi nebude uplně jako korektní řešení,ale napadlo mě následující. Pokud uploudnu fotku na server a změním ji příponu na *.php stane se graficky nečitelná ikdyž někdo zadá adresu do prohlížeče včetně přípony php. Ale pokud zobrazím takovou fotku pomocí <img src="./images/fotka.php" > Nevím,ale jestli to není moc hnusný hack, jestli by to fungovalo spolehlivě a ani jsem nezkoušel jiné typy obrázků :) |
||
Keeehi Profil |
#14 · Zasláno: 13. 10. 2016, 00:40:05
danhill:
Nefungovalo by to. Navíc je to obrovská bezpečnostní díra. |
||
Časová prodleva: 8 let
|
0