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
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'";
Pricemz jmeno/ cestu budes mit unikatni aby se nemohli obrazky duplikovat pro vypis.
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>&nbsp;</td>");
          }
          echo ("</tr>");
        }
        echo ("</table>");
No a pak pro stazeni staci kliknout pravim na obrazek a dat ulozit jako, a nebo si vytvoris script na tlacitko ktery hodis pod obrazek a ono ti ho to ulozi/vytiskne.
danhill
Profil
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
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
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
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).
danhill
Profil
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
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.
danhill
Profil
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
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" >
tak na webu se normálně zobrazí fotka a přípona php navíc zajistí,že nelze fotku stáhnout jako soubor ...
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
danhill:
Nefungovalo by to. Navíc je to obrovská bezpečnostní díra.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: