ďťż

[PHP obj.] Problem z kompilacją kodu

       

Podstrony


telcocafe

Witajcie.

Mój problem jest prawdopodobnie banalny, ale nie mam już nerwów, żeby go rozwiązać :/

Chodzi o poniższą linijkę kodu:

echo ("<img src=\""."getthumb.php?path=$path"."\" style=\"border:1px solid black;margin-top:20px;\" alt=\"$value\" /><br />\n");

która daje po skompilowaniu następujący output:

<img src="getthumb.php?path=graphics/Picture-009.jpg" style="border:1px solid black;margin-top:20px;" alt="Picture-009" /><br />

i w rezultacie nie wyświetlają się miniatury obrazków zawartych w katalogu, który jest na poziomie ./ względem pliku z kodem.

Kod pochodzi z książki PHP Programowanie obiektowe Petera Lavina.

Macie jakiś pomysł?



A powiedz mi, jak wygląda plik generujący obrazy? Bo to w nim jest problem, a nie tutaj.

Oto kod pliku:

<?php require 'ThumbnailImage.php'; $path = $_GET["path"]; $maxsize = $_GET["size"]; if(!isset($maxsize)){ $maxsize=100; } if(isset($path)){ $thumb =& new ThumbNailImage($path, $maxsize); $thumb->getImage(); } ?>

A ThumbnailImage.php to już 3.7 k kodu...

3.7k? 3.700 linijek kodu dla głupiej miniaturki. No cóż. Rozumiem, że dopiero się uczysz, ale jak masz trochę czasu to poczytaj o gd, czyli rozszerzeniu php do grafiki. Prostą miniaturkę sam zrobisz w kilku linijkach. A co myślisz, żeby popróbować sobie z tym kodem. Sprawdzić, czy aby na pewno jest wszystko w swoich folderach itd. Bo z tego dużo nie wynika i kod wydaje się być OK.



Gwoli wyjaśnienia: k = kB :-) Linijek jest jedynie 120. No cóż, powalczę więc z tym kodem w obiektach. Dzięki za rady.

Co wyświetli adres getthumb.php?path=graphics/Picture-009.jpg? Być może jest tam jakiś błąd, który jest zwracany zamiast obrazu.

Po wpisaniu ww. adresu pojawia się komunikat:

Warning: Cannot modify header information - headers already sent by (output started at [...]\getthumb.php:1) in [...]\ThumbnailImage.php on line 48

potem JFIF i krzaki w oknie przeglądarki (Opera).

Właśnie. Nie edytuj stron systemowym notatnikiem. Na początku pliku są znaki BOM. Usuń je jakimś normalnym edytorem (na przykład, Notepadem2).

Do edycji PHP-owych źródeł używam Notepada++ i o ile wiem, nie dodaje niczego od siebie. A z headerami jest problem tego typu, że jeden z plików wykorzystywanych podczas działania galerii zawiera zarówno kod PHP jak i HTML, z czego ten drugi mógł zostać przesłany przed wywołaniem silnika galerii.

Więc pokaż zawartość pliku ThumbnailImage.php, bo inaczej to tylko zgadywanie, co zepsułeś.
PS Akronimu PHP się nie odmienia.
Użytkownik andrzej_aa edytował ten post 09 marzec 2009, 18:18
Oto zawartość pliku ThumbnailImage.php. BTW: to nie ja zepsułem, tylko autor/tłumacz książki :)

<? class ThumbnailImage{ var $image; var $quality = 100; var $mimetype; var $imageproperties; var $initialfilesize; function __construct($file, $thumbnailsize = 100){ is_file($file) or die ("Plik: $file nie istnieje."); $this->initialfilesize = filesize($file); $this->imageproperties = getimagesize($file) or die ("Incorrect file type."); $this->mimetype = image_type_to_mime_type($this->imageproperties[2]); switch($this->imageproperties[2]){ case IMAGETYPE_JPEG: $this->image = imagecreatefromjpeg($file); break; case IMAGETYPE_GIF: $this->image = imagecreatefromgif($file); break; case IMAGETYPE_PNG: $this->image = imagecreatefrompng($file); break; default: die("Nie można utworzyć obrazu."); } $this->createThumb($thumbnailsize); } function __destruct(){ if(isset($this->image)){ imagedestroy($this->image); } } function getImage(){ header("Content-type: $this->mimetype"); switch($this->imageproperties[2]){ case IMAGETYPE_JPEG: imagejpeg($this->image,"",$this->quality); break; case IMAGETYPE_GIF: imagegif($this->image); break; case IMAGETYPE_PNG: imagepng($this->image,"",$this->quality); break; default: die("Nie można utworzyć obrazu."); } } function getMimeType(){ return $this->mimetype; } function getQuality(){ $quality = null; if($this->imageproperties[2] == IMAGETYPE_JPEG || $this->imageproperties[2] == IMAGETYPE_PNG){ $quality = $this->quality; } return $quality; } function setQuality($quality){ if($quality > 100 || $quality < 1){ $quality = 75; } if($this->imageproperties[2] == IMAGETYPE_JPEG || $this->imageproperties[2] == IMAGETYPE_PNG){ $this->quality = $quality; } } function getInitialFileSize(){ return $this->initialfilesize; } function createThumb($thumbnailsize){ $srcW = $this->imageproperties[0]; $srcH = $this->imageproperties[1]; if($srcW >$thumbnailsize || $srcH > $thumbnailsize){ $reduction = $this->calculateReduction($thumbnailsize); $desW = $srcW/$reduction; $desH = $srcH/$reduction; $copy = imagecreatetruecolor($desW, $desH); imagecopyresampled($copy,$this->image,0,0,0,0,$desW, $desH, $srcW, $srcH) or die ("Kopiowanie pliku nie powiodło się."); imagedestroy($this->image); $this->image = $copy; } } function calculateReduction($thumbnailsize){ $srcW = $this->imageproperties[0]; $srcH = $this->imageproperties[1]; if($srcW < $srcH){ $reduction = round($srcH/$thumbnailsize); }else{ $reduction = round($srcW/$thumbnailsize); } return $reduction; } } ?>

Tylko dwie rzeczy mi się rzucają w oczy. Przed <? są jakieś znaki lub powinieneś poprawić skrypt.<?php require 'ThumbnailImage.php'; if(isset($_GET["path"])){ $thumb =& new ThumbNailImage($_GET["path"], $_GET["size"] ? $_GET["size"] : 100); $thumb->getImage(); } ?>

Znaków raczej nie ma, a w każdym razie N++ ich nie wyświetla (pozycja kursora jest pokazywana prawidłowo).

Niestety, Helion nie udostępnił żadnych poprawek kodu z książki (a przynajmniej nie ma ich w miejscu ogólnodostępnym)...

Dzięki za pomoc, Andrzeju.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.