Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z wyświetleniem obrazka mediumblob
Forum PHP.pl > Forum > Bazy danych
chomikiki
Cześć,
Sprawdzając rozwiązania mojego problemu w internecie nie znalazłam działającego, więc bardzo proszę o pomoc. Do bazy dodaję obrazek, ale nie mogę go wyświetlić. Znalazłam sposób taki:

w bazie
  1. CREATE TABLE `foto` (
  2. `id_foto` int(11) NOT NULL,
  3. `picture` mediumblob NOT NULL,
  4. `type` char(60) COLLATE utf8_polish_ci NOT NULL,
  5. `name` text COLLATE utf8_polish_ci NOT NULL,
  6. `size` int(11) NOT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


model.php
  1. function F_List_fotos($list)
  2. {
  3. global $connect;
  4.  
  5. $ask='SELECT `id_foto`, `picture`, `type`, `name`, `size` FROM `foto`';
  6. if($query=@$connect->query(sprintf($ask))){
  7. $rows=$query->num_rows;
  8. if($rows>0){
  9. while ($row=$query->fetch_assoc()) {
  10. $foto=array('id_foto'=>$row['id_foto'], 'picture'=>$row['picture'], 'type'=>$row['type'], 'name'=>$row['name'], 'size'=>$row['size']);
  11. array_push($list, $foto);
  12. }
  13. }
  14. else {
  15. echo "brak zaplecz";
  16. }
  17. }
  18. else {
  19. echo "blad";
  20. }
  21.  
  22. return $list;
  23. }


kontroler.php
  1. $list_foto = array();
  2. $list_foto=F_List_fotos($list_foto);


widok.php
  1. <table class="table table-hover">
  2. <tr>
  3. <th></th>
  4. <th>Nazwa</th>
  5. <th></th>
  6. <th></th>
  7. </tr>
  8. </thead>
  9. <?php
  10. if (is_array($list_foto) || is_object($list_foto))
  11. foreach ($list_foto as $element) {
  12. ?>
  13. <tr>
  14. <td><?php
  15. header("Content-type:image/png");
  16. echo $element['picture']; ?></td>
  17. <td><?php echo $element['name']; ?></td>
  18. <td><a href="index.php?page=edit_foto"><i class="fa fa-pencil"></i></a></td>
  19. <td><a id="button" href="#page-wrapper" onclick="news(<?php echo $element['id_foto']; ?>)"><i class="fa fa-times"></i></a></td>
  20. </tr>
  21. <?php
  22. }
  23. ?>
  24. </tbody>


w rezultacie dostaje:
Warning: Cannot modify header information - headers already sent by [...] on line 54
�PNG  \0\0\0 IHDR\0\0G\0\0�\0\0\0<ׄp\0\0\0bK [...]

Wiem, że podobny temat już był, ale niestety rozwiązanie też nie pasuje sadsmiley02.gif
kapslokk
Jeżeli faktycznie trzymasz bloba z obrazkiem w bazie, to masz 2 opcje.
1. Zakodowanie obrazka do base64 i wyswietlenie go w <img src, przykład tutaj: http://stackoverflow.com/questions/35879/b...-encoding-image
2. Stworzenie skryptu który będzie służył TYLKO do wyświetlania obrazka. Czyli
  1. <?php
  2. // tutaj pobieranie z bazy
  3.  
  4. header("Content-type:image/png");
  5. echo $element['picture'];



I tyle, nic więcej nie wyświetlasz. I wtedy link do takiego skryptu podajesz sobie w tej tabelce w <img src="link-do-skryptu.php" alt="" />
chomikiki
Jest progres smile.gif nie ma krzaczków tylko teraz mam ten kwadracik z "obrazkiem" (ten standardowy gry obrazek się nie wyświetla)

widok.php
  1. <tr>
  2. <td><img src="foto.php"/></td>
  3. <td><?php echo $element['name']; ?></td>
  4. <td><a href="index.php?page=edit_foto"><i class="fa fa-pencil"></i></a></td>
  5. <td><a id="button" href="#page-wrapper" onclick="news(<?php echo $element['id_foto']; ?>)"><i class="fa fa-times"></i></a></td>
  6. </tr>


foto.php
  1. $list_foto=array();
  2. $list_foto=F_Foto($element['id_foto']);
  3. header("Content-type:".$list_foto['type']);
  4. echo $list_foto['picture'];


model.php
  1. function F_Foto($id_foto)
  2. {
  3. global $connect;
  4.  
  5. $ask="SELECT `picture`, `type`, `size` FROM `foto` WHERE id_foto='".$id_foto."'";
  6. if($query=@$connect->query(sprintf($ask))){
  7. $rows=$query->num_rows;
  8. if($rows>0){
  9. $row=$query->fetch_assoc();
  10. $foto_element=array('picture'=>$row['picture'], 'type'=>$row['type'], 'size'=>$row['size']);
  11. }
  12. else {
  13. echo "brak zaplecz";
  14. }
  15. }
  16. else {
  17. echo "blad";
  18. }
  19.  
  20. return $foto_element;
  21. }
kapslokk
W foto.php nie masz tablicy $element['id_foto']. ID zdjęcia możesz sobie przekazać GET'em.
Wtedy w foto.php będziesz miała:
  1. $list_foto=F_Foto($_GET['id']);

a w widoku
  1. <td><img src="foto.php?id=<?= $element['id_foto']; ?>"/></td>


chomikiki
w tym czasie tez już do tego doszłam smile.gif ale niestety to też nie to ;(
kapslokk
A jak odpalasz w przegladarce foto.php z jakims id ktore jest w bazie, to obrazek sie pokazuje?
chomikiki
ani: <td><img src="view/admin/foto.php?id=1"/></td>
ani

foto.php
  1. $list_foto=array();
  2. $list_foto=F_Foto(1);
  3. header("Content-type:".$list_foto['type']);
  4. echo $list_foto['picture'];


nie działa
kapslokk
A jak usuniesz header("Content-type:".$list_foto['type']); to co się pojawia?
chomikiki
nic... bez różnicy
w ogóle mam wrażenie że do tego pliku mi nie wchodzi sad.gif
kapslokk
W przeglądarce w pasku adresu wpisz adres-twojej-strony/view/admin/foto.php?id=1
Powinny się wyświetlić jakieś krzaki, bez headera. Jeśli się nie wyświetlają, to sprawdź czy nie masz błędów i czy obrazek z id == 1 istnieje w bazie.
chomikiki
znalazłam
weszłam przez źródło strony i jest <td><img src="view/admin/foto.php?id=1"/></td> a jak weszłam w ten plik to jest błąd "Fatal error: Uncaught Error: Call to undefined function F_Foto() " - nie dodałam pliku z funkcją, ale mimo wszystko też nie pomogło. W pliku pokazały się znowu krzaczki, po dodaniu header("Content-type:".$list_foto['type']); zmieniło się na pusta ramkę, ale na stronie właściwej dalej jest ten znak obrazka ;(
w bazie na pewno jest obrazek o tym id bo mi na liście pokazuje.
Tym drugim sposobem tez próbowałam ale chyba tam tez coś źle robię ;( w ścieżce do obrazka jest <td><img src="data:image/png;base64,"/></td> i pojawia się "Warning: file_get_contents(image/png/flaga.png): failed to open stream: No such file or directory" i pojawia się pusta ramka rozmiarów 20px x 20px

W tym momencie kod wygląda tak

model
  1. function F_List_fotos($list)
  2. {
  3. global $connect;
  4.  
  5. $ask='SELECT `id_foto`, `picture`, `type`, `name`, `size` FROM `foto`';
  6. if($query=@$connect->query(sprintf($ask))){
  7. $rows=$query->num_rows;
  8. if($rows>0){
  9. while ($row=$query->fetch_assoc()) {
  10.  
  11. $picture = base64_encode(file_get_contents($row['type']."/".$row['name']));
  12. $foto=array('id_foto'=>$row['id_foto'], 'picture'=>$picture, 'name'=>$row['name']);
  13. array_push($list, $foto);
  14. }
  15. }
  16. else {
  17. echo "brak zaplecz";
  18. }
  19. }
  20. else {
  21. echo "blad";
  22. }
  23.  
  24. return $list;
  25. }
  26.  
  27. function F_Foto($id_foto)
  28. {
  29. global $connect;
  30. $ask="SELECT `picture`, `type`, `size` FROM `foto` WHERE id_foto='".$id_foto."'";
  31. if($query=@$connect->query(sprintf($ask))){
  32. $rows=$query->num_rows;
  33. if($rows>0){
  34. $row=$query->fetch_assoc();
  35. $foto_element=array('picture'=>$row['picture'], 'type'=>$row['type'], 'size'=>$row['size']);
  36. }
  37. else {
  38. echo "brak zaplecz";
  39. }
  40. }
  41. else {
  42. echo "blad";
  43. }
  44.  
  45. return $foto_element;
  46. }


widok
  1. <?php
  2. if (is_array($list_foto) || is_object($list_foto))
  3. foreach ($list_foto as $element) {
  4. ?>
  5. <tr>
  6. <td><?php echo $element['id_foto']; ?></td>
  7. <td><img src="view/admin/foto.php?id=<?php echo $element['id_foto']; ?>"/></td>
  8. <td><img src="data:<?php echo $element['type']; ?>;base64,<?php echo $element['picture']; ?>"/></td>
  9. <td><?php echo $element['name']; ?></td>
  10. <td><a href="index.php?page=edit_foto"><i class="fa fa-pencil"></i></a></td>
  11. <td><a id="button" href="#page-wrapper" onclick="news(<?php echo $element['id_foto']; ?>)"><i class="fa fa-times"></i></a></td>
  12. </tr>
  13. <?php
  14. }
  15. ?>


foto.php
  1. require_once '../../model/foto.php';
  2.  
  3. $list_foto=array();
  4. $list_foto=F_Foto($_GET['id']);
  5. header("Content-type:".$list_foto['type']);
  6. echo $list_foto['picture'];


kontroler (bez zmian)
  1. $list_foto = array();
  2. $list_foto=F_List_fotos($list_foto);
kapslokk
$picture = base64_encode(file_get_contents($row['type']."/".$row['name']));
W tym miejscu zamiast file_get_contents(), powinnas miec wstawiony obrazek z bazy.

Ponadto wrzuć krzaki, które się wyświetlają w pliku foto.php na jakiegoś pastebina i pokaż.
chomikiki
https://zapodaj.net/e7257de7e72c5.png.html

  1. <tr>
  2. <td><?php echo $element['id_foto']; ?></td>
  3. <td><img src="view/admin/foto.php?id=<?php echo $element['id_foto']; ?>"/></td>
  4. <td><img src="data:<?php echo $element['type']; ?>;base64,<?php echo $element['picture']; ?>"/></td>
  5. <td><?php echo $element['name']; ?></td>
  6. <td><a href="index.php?page=edit_foto"><i class="fa fa-pencil"></i></a></td>
  7. <td><a id="button" href="#page-wrapper" onclick="news(<?php echo $element['id_foto']; ?>)"><i class="fa fa-times"></i></a></td>
  8. </tr>


tak jest w przeglądarce
  1. <tr>
  2. <td>1</td>
  3. <td><img src="view/admin/foto.php?id=1"/></td>
  4. <td><img src="data:image/png;base64,aW1hZ2UvcG5nL2ZsYWdhLnBuZw=="/></td>
  5. <td>flaga.png</td>
  6. <td><a href="index.php?page=edit_foto"><i class="fa fa-pencil"></i></a></td>
  7. <td><a id="button" href="#page-wrapper" onclick="news(1)"><i class="fa fa-times"></i></a></td>
  8. </tr>


model - usunęłam file_get_contents()
  1. $picture = base64_encode($row['type']."/".$row['name']);



EDIT:
Dzięki wielkie kapslokk za pomoc i czas wink.gif

Okazało się jednak że nie muszę ich przechowywać w bazie tylko wrzucam je na serwer. To jest dużo dużo łatwiejsze i mniej skomplikowane... wystarczą dwie linijki haha.gif

Dla chętnych wypróbowania tego rozwiązania
  1. if($_FILES['foto']['error']==UPLOAD_ERR_OK){
  2. $hidden_max_size=$_POST['hidden_max_size'];
  3. $foto_name=$_FILES['foto']['name'];
  4. $foto_type=$_FILES['foto']['type'];
  5. $foto_size=$_FILES['foto']['size'];
  6. $foto_src=$_FILES['foto']['tmp_name'];
  7.  
  8. if(is_uploaded_file($foto_src))
  9. move_uploaded_file($foto_src, "upload/$foto_name"); // upload/ - ścieżka do katalogu stworzonego na serwerze; u mnie w katalogu głównym
  10. }
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.