Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie zdjęć z bazy - jak rozkodować?
Forum PHP.pl > Forum > PHP
szopik
Witam, mam taki problem muszę zrobić pobieranie zdjęć umieszczonych w bazie danych (typ pola BLOB), wszystko się pobiera jest dobrze tylko mam problem z rozkodowaniem zdjęć (pojawiają się krzaczki) o czym mogłem zapomnieć?

plik default.php odpowiedzialny za wyświetlanie:
  1. <?php
  2. // no direct access
  3. defined('_JEXEC') or die; ?>
  4.  
  5. <div class="moduletable<?php echo $params->get( 'moduleclass_sfx' ) ?>">
  6. <ul>
  7. <?php
  8. header('Content-type: image/jpeg');
  9. for ($i=0;$i< sizeof($list["images"]); $i++) { ?>
  10.  
  11. <li>
  12. <?php if ($params->get( 'image_id' )) { ?>
  13. <span><?php echo $list["images"][$i]["id"];?></span>
  14. <?php } ?>
  15. <?php if ($params->get( 'image_image' )) { ?>
  16. <span><?php echo '<img class="Slide" src="'.$list["images"][$i]["image"].'"';?></span>
  17. <?php } ?>
  18. <?php if ($params->get( 'image_typ' )) { ?>
  19. <span><?php echo $list["images"][$i]["typ"];?></span>
  20. <?php } ?>
  21. </li>
  22.  
  23. <?php } ?>
  24. </ul>
  25.  
  26. </div>


plik helper.php - pobieranie z bazy danych
  1. <?php
  2. // no direct access
  3. defined('_JEXEC') or die;
  4.  
  5. class modUserDataHelper
  6. {
  7. function getData( &$params )
  8. {
  9.  
  10. // Database query
  11. header('Content-type: image/jpeg');
  12. $list = array();
  13. $query = " SELECT id, image, typ "
  14. ." FROM images "
  15.  
  16. ." ORDER BY id DESC "
  17. ." LIMIT " . $params->get( 'limit' );
  18. $db =& JFactory::getDBO();
  19. $db->setQuery( $query );
  20. $rows = $db->loadObjectList();
  21.  
  22.  
  23.  
  24. // Get list items
  25. if ($rows!=null)
  26. {
  27. $i=0;
  28. foreach ($rows as $row)
  29. {
  30. $list["images"][$i]["id"]=$row->id;
  31. $list["images"][$i]["image"]=base64_decode($row->image);
  32. $list["images"][$i]["typ"]=$row->typ;
  33. $i++;
  34. }
  35. return $list;
  36. }
  37.  
  38. }
  39. }
Sephirus
Ok ja tu widze pomieszanie z poplątaniem ;P

Rozumiem że chcesz albo zwracać obrazek albo go wyświetlać dynamicznie w HTML'u...

1. Jeżeli chcesz wyśwetlać to HEADER ustawiony na typ obrazka jest ok ale kod HTML go oblewający już nie - napraw to
1.1 Jeżeli chcesz wyrzucić treść obrazka jako obrazek (plik) bez html'a to też nie wiem czy słusznie w helperze dekodujesz go z base64? Przy wrzucaniu Enkodujesz?

2. Jeżeli chcesz go wrzucić w HTML jako <img...> to zapoznaj się ze składnią <img src="data:image/gif;base64,KOD_OBRAZKA_ZAKODOWANY_W_BASE64"/>

Mam nadzieję, że choć troszkę Ci pomogłem wink.gif
szopik
Jest to możliwe że poplątałem wszystko w każdym razie chce pobrać sobie obrazki z bazy i poukładać ładnie w htmlu najprościej rzecz ujmując. Co do nagłówków faktycznie coś pomieszałem, ale prosiłbym o konkretne porady co gdzie i jak jeżeli to możliwe.
Sephirus
Ok teraz trochę lepiej rozumiem wink.gif


Ok muszę wiedzieć jak wrzucasz obrazki do bazy. Możesz wrzucić kod?

Albo tak moja propozycja.

Wrzucaj do bazy obrazki do tej tabelki jako

  1. $tresc = base64encode(file_get_contents('plik.jpg'));


następnie po wyjęciu z bazy nic nie rób z zawartością, wrzuć ją tylko do

  1.  
  2.  
  3. echo '<img src="data:image/jpeg;base64,'.$tresc.'"/>';


oczywiście zamiast jpeg - wrzucasz typ pliku jeśli jest inny

i powinno śmigać, pokasuj wszędzie te nagłówki ( header(...) )
szopik
Poniżej kod jak dodaje obrazek do bazy:

  1. $img_count = 0;
  2. foreach ($_FILES["images"]["error"] as $key => $error)
  3. {
  4. // If uplod is successful
  5. if($error == UPLOAD_ERR_OK)
  6. {
  7. $image = chunk_split(base64_encode(file_get_contents($_FILES["images"]['tmp_name'][$key])));
  8. $query = "INSERT INTO images (image) VALUES('$image')";
  9. mysql_query($query);
  10. $img_count++;
  11. }
  12. }
  13.  
  14. echo "<strong>Total images uploaded: </strong>". $img_count;


Sephirus
hmm nie wiem czy chunk_split Ci tego nie chrzani bo dorzuca entery po iluśtam znakach, spróbuj bez tego i wyświetl tak jak Ci wyżej napisałem
szopik
A jak obrazek będzie wrzucony do bazy żywcem bez kodowania? To może tak będzie lepiej?
Sephirus
Szczerze to można go tak wrzucić ale poprzez wykorzystanie LO czyli Large Object'ów musisz o tym poczytać bo je się troszkę inaczej wrzuca... tak czy siak sprawdziłem to i doszedłem do takich wniosków:

1. Mi mój sposób działa - wrzuciłem plik do bazy, potem go wyjąłem i wyświetliłem moim sposobem - DZIAŁA.
2. Chunk split jednak nie ma znaczenia - nie psuje nic

3. Czy w pliku helper.php poprawiłeś to aby nie było tam $list["images"][$i]["image"]=base64_decode($row->image);? bo nie możesz tego dekodować.. do <IMG> podajesz zakodowane w base64

Przedstawiam CI mój banalny kod:

  1. mysql_connect('localhost','*****','****');
  2. mysql_select_db('****');
  3.  
  4. if($_GET['op'] == 'add'):
  5.  
  6.  
  7. mysql_query("INSERT INTO test_img (image) VALUES ('".$img."')");
  8. else:
  9.  
  10. $r = mysql_fetch_array(mysql_query("SELECT * FROM test_img LIMIT 1"));
  11.  
  12. echo '<img src="data:image/jpeg;base64,'.$r['image'].'"/>';
  13. endif;
leafnode
Od siebie dodam tylko, że wsadzanie obrazków in-line (== <img src="data:image...) spowoduje, że obrazki nie będą buforowane przez przeglądarkę, za każdym razem pobierane z serwera, co powoduje oczywiste (zużycie łącza, serwera itp). Efektywniejsze jest generowanie obrazków osobnym skryptem, służącym tylko do tego.

Przykładowo.

Główny skrypt:
  1. <img src="img.php?id=123" />
  2. </body>
  3. </html>


img.php:
  1. <?php
  2.  
  3. header('Content-type: image/jpeg');
  4. $db = new PDO(...);
  5. $stmt = $db->prepare("select image from images where id = ?");
  6. $stmt->execute($_GET['id']);
  7. $result = $stmt->fetch(PDO::FETCH_ASSOC);
  8. echo $result['image'];
  9.  


No i oczywiście przechowywanie plików w bazie danych powinno być mocno przemyślane i stosowane tylko w bardzo szczególnych warunkach, ale to już tak na marginesie i zakładam, że zostały rozważone wszystkie za i przeciw wink.gif

ln.
cojack
Zapis zdjęć do bazy w postaci BYTEA czy BASE64 to najgłupszy pomysł jaki widziałem do tej pory.
Sephirus
@up - ale żeś się wypowiedział smile.gif To może podzielisz się z kolegami komentarzem "czemu tak uważasz / czemu tak jest i jak Ty byś to rozwiązał" smile.gif
8_pasazer_NOSTROMO
Witam

Podepnę się pod tematu bo mam podobny problem, wynika z on z tego, że kiedyś gdy zapisywałem obrazki do bazy to kodowałem je base64_encode. A obecnie chce mieć fotki nie kodawane niczym.

Baza składa się z 3 kolumn
ID
FOTKA --> tutaj są fotki zakodowane
FOTO -- > tutaj nie ma nic, ale chce żeby tutaj były te same fotki lecz odkodowane


W przyszłości usunę kolumnę FOTKA.

Chciałbym się dowiedzieć jak pobrać fotki zakodowane (ROZKODOWAĆ JE) i wrzucić jako fotki nie kodowane (KLASYCZNE). Próbowałem tak, ale lipa, nie działa.

  1. include "../../baza.php";
  2. header("Content-type: image/jpg;");
  3. $wynik = mysql_query("SELECT fotka FROM foto WHERE id='105'");
  4. $foto = mysql_fetch_assoc($wynik);
  5. $foto2=base64_decode($foto['fotka']);
  6.  
  7. $zapytanie = "update foto set foto='$foto2' where (id='105')";
  8. $wykonaj = mysql_query($zapytanie) or die ("Update błędne");

Jak to zamienić z kodowanych na niekodowane i wpisać do bazy w kolumnę obok pod tym samym ID.

Ponawiam prośbę o pomoc. Nikt nie wie jak to rozkodować i zapisać w bazie danych questionmark.gif

.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.