Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z header ("Content-type: image/jpeg");
Forum PHP.pl > Forum > PHP
Kas
Mam generator miniatur.

  1. <?php
  2. header ("Content-type: image/jpeg");
  3. define("THUMB", 1);
  4. $inc = substr(dirname(__FILE__), 0, -7) . "";
  5. $dir = getcwd();
  6. define("BASEDIR", $inc);
  7. include("$inc/inc/init.php");
  8.  
  9. $_REQUEST['img_id'] = str_replace(array(':','/','''),'',$_REQUEST['img_id']);
  10.  
  11. $sql = $db->Query("SELECT galwidth,galheight,nofactor,thumbcomp FROM " . PREFIX . "_settings");
  12. $row = $sql->fetchrow();
  13.  
  14. $pref['thumbw'] = !$row->galwidth ? 120 : $row->galwidth;
  15. $pref['thumbh'] = !$row->galheight ? 90 : $row->galheight ;
  16. $pref['nofactor'] = $row->nofactor;
  17. $pref['thumbcomp'] = !$row->thumbcomp ? 90 : $row->thumbcomp;
  18.  
  19. switch($_REQUEST['smode']){
  20. case 1 :
  21. $thumb_w = $pref['thumbw'] / 2.2;
  22. $thumb_h = $pref['thumbh'] / 2.2;
  23. break;
  24.  
  25. case 2 :
  26. $thumb_w = $pref['thumbw'] / 1.8;
  27. $thumb_h = $pref['thumbh'] / 1.8;
  28. break;
  29.  
  30. default:
  31. $thumb_w = $pref['thumbw'];
  32. $thumb_h = $pref['thumbh'];
  33. break;
  34. }
  35.  
  36. $w = $thumb_w;
  37. $h = $thumb_h;
  38.  
  39. if ($_REQUEST['type'] == "inline") {
  40. //header ("Content-type: image/jpeg");
  41. $end = ".jpg";
  42. $q = BASEDIR . "/uploads/inlineshots/" . $_REQUEST['img_id']. "";
  43. $quelle = imagecreatefromjpeg(BASEDIR . "/uploads/inlineshots/" . $_REQUEST['img_id'] . "");
  44. $uid = md5($thumb_w . $h . $q);
  45.  
  46. if(file_exists(BASEDIR . '/cache/'.$uid)){
  47. //header ("Content-type: image/jpeg");
  48. readfile(BASEDIR . '/cache/'.$uid);
  49. exit();
  50. }
  51.  
  52. } else {
  53. $sql = $db->Query("SELECT path FROM " . $dbprefix . "_gallery_items WHERE id=$_REQUEST[img_id] ");
  54. $row = $sql->fetchrow();
  55.  
  56. if (!$row) $row->path = "nopic.jpg";
  57. $end = substr($row->path, -4);
  58.  
  59. $q = BASEDIR . "/uploads/galerie/" . $row->path . "";
  60. $uid = md5($thumb_w . $h . $q);
  61.  
  62. if (!file_exists(BASEDIR . "/uploads/galerie/" . $row->path . "")) $_REQUEST['file'] = "dummy.jpg";
  63.  
  64. if(file_exists(BASEDIR . '/cache/'.$uid)){
  65. if($end == '.jpg' || $end == 'jpeg'); //header ("Content-type: image/jpeg");
  66. elseif($end == '.png'); //header ("Content-type: image/png");
  67. elseif($end == '.gif'); //header ("Content-type: image/gif");
  68. readfile(BASEDIR . '/cache/'.$uid);
  69. exit();
  70. }
  71.  
  72.  
  73. switch($end){
  74. case '.jpg':
  75. case 'jpeg':
  76. $q = BASEDIR . "/uploads/galerie/" . $row->path . "";
  77. $quelle = imagecreatefromjpeg($q);
  78. header ("Content-type: image/jpeg");
  79. break;
  80.  
  81. case '.png':
  82. $q = BASEDIR . "/uploads/galerie/" . $row->path . "";
  83. $quelle = @imagecreatefrompng($q);
  84. header ("Content-type: image/png");
  85. break;
  86.  
  87. default:
  88. $quelle = $q;
  89. header ("Content-type: image/gif");
  90. break;
  91. }
  92.  
  93.  
  94. }
  95.  
  96. $sz = $thumb_w;
  97. $sz2 = $thumb_h;
  98.  
  99. $im_width = imageSX($quelle);
  100. $im_height = imageSY($quelle);
  101.  
  102. if ($pref['nofactor'] != 1) {
  103. $factor = $sz / $im_width;
  104. $w = $sz;
  105. $h = $im_height * $factor;
  106. }
  107.  
  108.  
  109. if (gdversion() >= 2) {
  110. $ziel = imagecreatetruecolor($w, $h);
  111. $ziel_bg = imagecolorallocate($ziel,255,255,255);
  112. imagefill($ziel , 0, 0, $ziel_bg);
  113. } else {
  114. $ziel = imagecreate($w, $h);
  115. }
  116.  
  117. @imagecopyresampled($ziel, $quelle, 0, 0, 0, 0, $w, $h, imagesx($quelle), imagesy($quelle));
  118.  
  119. switch($end){
  120. case '.jpg':
  121. case 'jpeg':
  122. $bild = @imagejpeg($ziel, "", $pref['thumbcomp']);
  123. break;
  124.  
  125. case '.png':
  126. $bild = @imagepng($ziel, "", $pref['thumbcomp']);
  127. break;
  128.  
  129. default:
  130. $bild = $quelle;
  131. break;
  132. }
  133.  
  134. $a = ob_get_contents();
  135. $fp = fopen(BASEDIR . "/cache/".$uid, "wb+");
  136. fwrite($fp, $a);
  137. fclose($fp);
  138. echo $a;
  139. exit();
  140. ?>


Z nieokreślonych przyczyn wygenerowany obrazek nie jest normalnie widoczny.

Gdy nie dam:
  1. <?php
  2. header ("Content-type: image/jpeg");
  3. ?>

Pojawią się znane każdmu krzaczki.

Ale nawet z gdy dodam typ obrazek nie pokazuje się poprawnie. Przykład tutaj. Na ekrenie pokazuje się url, zaś dopiero w kodzie strony są krzaczki.

Zawrówno bez nagłówka jak i z nim po zapisanu "strony" na dysku z właściwym rozszerzeniem obrazek normalnie działa. Co robię źle?
kosheen2k
Drogi przyjacielu, wygląda na to, że ten skrypt jest OK ale najprawdopodobniej ścieżki do plików są coś nie tak, bo z tego co widziałem w przykładzie to plik w ogóle jest nie odnajdywany.... sprawdź na początku ścieżki, bo może to być przyczyna, najlepiej na koncu skryptu dodaj
  1. <?php
  2. echo($q);
  3. ?>
i powinno Ci wyświetlić ścieżkę do plików.

Są to tylko moje przypuszczenia (sugestie), więc sprawdź i napisz co zdziałałeś.

Pozdrawiam.
Kas
Drogi Przyjacielu, za kogo mnie uważasz?

  1. <?php
  2. // System ratunkowy :)
  3.  
  4. echo("rozszerzenie: $end <br>");
  5. echo("nazwa: $row->path <br>");
  6. echo("sciezka: $q <br>");
  7.  
  8. if (file_exists($q)) {
  9. echo "plik $q istnieje<br>"; 
  10. }
  11. else {
  12. echo "plik $q nie istnieje<br>"; 
  13. }
  14.  
  15. echo ("hash: $uid<br>");
  16.  
  17. if(file_exists(BASEDIR . '/cache/'.$uid)){
  18. echo "plik $uid istnieje<br>"; 
  19. }
  20. else {
  21. echo "plik $uid nie istnieje<br>"; 
  22. } 
  23.  
  24. if (!$quelle) {
  25. echo ("zmienna quelle istnieje<br>");
  26. }
  27. else {
  28. echo ("zmienna quelle nie istnieje<br>");
  29. }
  30.  
  31. if ($_REQUEST['type'] == "inline") {
  32. echo ("warunek spelniony<br>");
  33. }
  34. else {
  35. echo ("warunek nie spelniony<br>");
  36. }
  37.  
  38. if (headers_sent()) {
  39. echo ("naglowki zostaly wyslane<br>");
  40. }
  41. else {
  42. echo ("naglowki nie zostaly wyslane<br>");
  43. }
  44.  
  45. $plik = "/usr/home/mgras/domains/cwr.pl/public_html/system/thumb.php";
  46.  
  47. if (headers_sent($plik)) {
  48. echo ("naglowki zostaly wyslane przez thumb.php<br>");
  49. }
  50. else {
  51. echo ("naglowki nie zostaly wyslane przez thumb.php<br>");
  52. }
  53.  
  54. ?>


Rozszerzenie jest wykrywane poprawnie.
Nazwa jest pobierana z bazy.
Ścieżka jest poprawna.
Obrazek istnieje.
Hash jest poprawny.
I cache zawiera infomację o tym obrazku.
Zmienna $quelle istnieje (a chyba nie powinna).
Warunek jest spełniony.
Nagłówki są wysyłane.
I to przez thumb.php.

Nie wrzucałem tego do wcześniejszego posta żeby nie zaśmiecać i nie ma tego w "przykładzie" bo nad nim właśnie pracuję. smile.gif
Hacker
  1. <?php
  2. header ("Content-type: image/jpeg");
  3. define("THUMB", 1);
  4. ?>
startujesz potem jeszcze raz, a gdzie do tego ob-ka end_flush albo end_clean??
Kas
Na samym końcu.

  1. <?php
  2. ?>


Więc powinno działać.
Hacker
  1. <?php
  2. switch($end){
  3. case '.jpg':
  4. case 'jpeg':
  5. $bild = @imagejpeg($ziel, "", $pref['thumbcomp']);
  6. break;
  7.  
  8. case '.png':
  9. $bild = @imagepng($ziel, "", $pref['thumbcomp']);
  10. break;
  11.  
  12. default:
  13. $bild = $quelle;
  14. break;
  15. }
  16.  
  17. $a = ob_get_contents();
  18. $fp = fopen(BASEDIR . "/cache/".$uid, "wb+");
  19. fwrite($fp, $a);
  20. fclose($fp);
  21. echo $a;
  22. exit();
  23. ?>

Usuń ten fragment kodu i daj na końcu ob_end_flush(); i jak nie będzie pusto to o to chodzi
Vogel
druga sprawa - nie rozpoznawaj plikow po rozszerzeniu tylko sprawdz typ mime albo uzyj getimagesize()!
Kas
Wykomentowałem ten kod. Efekt identyczny jak wcześniej. Swoją drogą nie zauważyłem tego zdublowanego ob_start(), ale jego usunięcie nic nie zmienia. sad.gif
Hacker
co wyświetla jak dasz ob_end_flush a usuniesz tamten kod co podałem??
Kas
Dokładnie to samo co wcześniej. Po prostu adres i krzaczki obrazka w kodzie strony.

Cytat
druga sprawa - nie rozpoznawaj plikow po rozszerzeniu tylko sprawdz typ mime albo uzyj getimagesize()!

Dzięki. Tak zrobię. smile.gif

Dodam, że obrazek po zapisniu na dysku działa poprawnie. Ale nie w każdym programie. Np. Irfan View go otwiera, a Corel Photo-Paint i Paint już nie.
Coach
To kwestia ustawień buforowania serwera. Na jednym zadziała, na innym nie.
Dodaj przed wywołaniem headera:

while (@ob_end_clean());

(wiem, że temat stary, ale właśnie miałem ten problem u siebie, i zapodaję rozwiązanie dla potomności).
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.