Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Blad podczas wyswietlania grafiki
Forum PHP.pl > Forum > PHP
marcio
Witam wiem ze temat walkowany ale ja na gd i buforuwaniu sie nie znam.
Wchodzac na www.marcio.ekmll.com/captcha.php widac ze wszystko dziala.
Jak ze wziolem sie za pisanie biblioteki do obslugi grafiki chcialem ja wczoraj przetestowac jednak nie dziala gdy chce ja wykorzystac w jakims komponencie/pluginie lub na stronie index.php w czasie testow co jest denerwujace bo nawet jesli dziala w fw poki co nie moge uzyc.
Tak wyglada index.php z testowana biblioteka:
  1. <?php
  2.  
  3. require_once('frontcontroller/Init.php');
  4. require_once('libraries/Captcha.php');
  5.  
  6. $core = new Dispatcher();
  7. $core -> Exec($router);
  8.  
  9. $captcha = new Captcha();
  10. echo('<img src='.$captcha -> Render().'>');
  11.  
  12. ?>

Probowalem uzywac ob_flush()/ob_end_flush()/ob_clean() i ob_end_clean co najwyzej wyswietlala sie strona z bledem header'a bez captch'y lub sama captcha bez strony.
Tutaj jest klasa Captcha: http://3paste.com/hash/b21a2b54dba5810aa9301fa01215c1b1
Moze mam zastosowac jakos buforowanie w __construct()/__destruct zeby zadzialalo jednak z pomoca zwracam sie do was.

P.S nie ma to jak niezle wciecia na 3paste smile.gif

?
darko
Wklej jeszcze libraries/drivers/Captcha/Math_Driver.php
bo nie widzę, żebyś coś zwracał, albo gdzieś miał echo lub print. Sprawdź jeszcze czy masz bibliotekę GD włączoną.
marcio
Cytat(darko @ 12.02.2010, 17:50:01 ) *
Wklej jeszcze libraries/drivers/Captcha/Math_Driver.php
bo nie widzę, żebyś coś zwracał, albo gdzieś miał echo lub print. Sprawdź jeszcze czy masz bibliotekę GD włączoną.

To jest tylko sterownik ktory zwraca losowy ciag w przypadku Random i dzialanie matematyczne w przypadku Math.
Sam lib dziala ale tylko gdy go wywoluje jako osobny plik: http://marcio.ekmll.com/captcha.php
Jednak jesli chce to uzyc we FW w jakims komponencie to nie dziala bo jak wiadomo mamy juz naglowek z html'a.
Chce zeby dzialalo jak to jest w kohana ze biblioteke captcha/image moge wywolac gdzie chce i ma dzialac a nie z osobnego pliku bo dla mnie to zadne rozwiazanie.
darko
Nadpisz metodę RenderCaptcha() tak, żeby nie wysyłała utworzonego obrazka captcha do przeglądarki, ale żeby zapisywała tymczasowo na serwerze plik, do którego zresztą intuicyjnie próbujesz podać ścieżkę pisząc:

  1. echo('<img src='.$captcha -> Render().'>');


i po problemie.
marcio
Cytat(darko @ 13.02.2010, 04:04:18 ) *
Nadpisz metodę RenderCaptcha() tak, żeby nie wysyłała utworzonego obrazka captcha do przeglądarki, ale żeby zapisywała tymczasowo na serwerze plik, do którego zresztą intuicyjnie próbujesz podać ścieżkę pisząc:

i po problemie.

Tzn cos takiego?
  1. public function RenderCaptcha() {
  2.  
  3. header("Content-type: image/".$this -> CaptchaType);
  4. $func = 'image'.$this -> CaptchaType;
  5. $func($this -> img, 'image/captcha.png', 5);
  6. imagedestroy($this -> img);
  7.  
  8. }

Potem mam robic?
  1. echo('<img src=''image/captcha.png">');

Lub poprostu w metodzie Render() mam zwracAC sciezke o to chodzi?
IMHO totalny bezsens szkoda transferu wiecej czasu to zajmie potem musialbym usuwac captche albo nadpisywac za kazdym razem.

Sprobowalem tak jak opisalem wyzej chyba zgodne z tym co ty napisales.
Wszystko wporzo obrazek sie zapisuje i mozna go wyswietlic tylko za kazdym przeladowaniem strony captcha ma byc inny wiec trzeba usunac stary i utworzyc nowy, problem w tym ze obraz oprocz tego ze jest zapisywany jest tez wysylany odrazy do przegladarki i nie dziala.
darko
zakomentuj linię:
  1. header("Content-type: image/".$this -> CaptchaType);

i zrób taki mały "trik", że jak zwrócisz ścieżkę do obrazka i wyplujesz kod html to wywołaj wtedy metodę (którą sobie napiszesz), która usunie fizycznie plik z serwera.
marcio
Ok dziala:
  1. protected function RenderCaptcha() {
  2.  
  3. $func = 'image'.$this -> CaptchaType;
  4. $func($this -> img, $this -> ImgCaptchaName);
  5. imagedestroy($this -> img);
  6.  
  7. }
  8.  
  9.  
  10. protected function Render() {
  11.  
  12. if(file_exists($this -> ImgCaptchaName)) {
  13.  
  14. unlink($this -> ImgCaptchaName);
  15.  
  16. }
  17.  
  18. $func = $this -> Driver.'Captcha';
  19. $code = $this -> ObjectRandom -> $func();
  20. $this -> CreateCaptcha($code);
  21. $this -> RenderCaptcha();
  22.  
  23. }
  24.  
  25.  
  26. public function getCaptcha() {
  27.  
  28. $this -> Render();
  29.  
  30. return '<img src="'. $this -> ImgCaptchaName.'" alt="captcha" />';
  31.  
  32. }

W komponencie robie np:
  1. $captcha = new Captcha();
  2. echo($captcha -> getCaptcha());

Dzialac dziala tylko teraz mam pytanie jak mam teraz kombinowac z biblioteka do obrobki obrazkow?
Raczej nie moge postapic tak samo bo:
1)Co jesli w locie chce zrobic kilka czynnosci na jednym img musialbym znac sciezke do ktorej kazda funkcja bedzie zapisywac img za kazdym razem.
2)Co jesli bede chcial zapisac img bo bedzie to avatar user'a ktore zostal juz pomniejszony jedyne co mi przychodzi do glowy to kombinowac z arg. funkcji robic coa takiego:
  1. public funtion Resize($imagePath, $height = 60, $width = 120, $save = false) {
  2.  
  3. }

Gdy $save = false funkcja resize zapisuje tymczasowo img do images/resize.png gdy $save != false to zapisujemy do sciezki podanej wlasnie w tym arg.
Poterm znow za kazda obrobka kazda metoda bedzie musiala sprawdzac czy istnieje plik dla danej funkcji jesli tak usunac go by stworzyc nowy itp...
Troche duzo kombinowania tzn mi to tam wisi bo dzialac bedzie ale troche bez sensu i malo profesjonalne.

Podgladalem zrodla kohany ale tam tez maja naglowki i wszystko dziala.

P.S
  1. i zrób taki mały "trik", że jak zwrócisz ścieżkę do obrazka i wyplujesz kod html to wywołaj wtedy metodę (którą sobie napiszesz), która usunie fizycznie plik z serwera.

Zeby juz nic nie wywolywac to destruct bedzie chyba lepszy.
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.