Nette\Image dynamicky obrázek pro img src
- motorcb
- Člen | 552
Zdravím.
Chtěl bych pro každého uživatele generovat vlastní obrázek (obrázek
nepotřebuji ukládat na disk – zbytečně by zabíral místo – každým
vygenerováním bude jiný).
public function actionUserPicture()
{
...
$image = Image::fromBlank( 500, 300, Image::rgb( 200, 200, 200 ) );
$font_path = '../www/fonts/arial.ttf';
$image->ttfText(20, 0, 10, 100, Nette\Image::rgb(0, 0, 0), $font_path, "Vaše umístění: ".$position );
$image->send( Image::PNG );
}
<img src="/homepage/user-picture">
Tento kod mi obrázek do stránky vygeneruje ale zároveň v konzoli
prohlížeče vidím:
Failed to load resource: the server responded with a status of 500 (Internal
Server Error)
ale když dám do prohlížeče: …cz/homepage/user-picture tak obrázek vidím a žádná chyba nenastane.
Poradil by někdo jak to dělat správně?
Díky
- Badaboom
- Člen | 33
Zkus po odeslání obrázku ukončit aplikaci. Imho pokračuje vykreslování šablony, ta neexistuje a proto error.
...
$this->send();
$this->terminate();
K jak to dělat správně bych řekl, že imho spouštět kvůli generování obrázků framework je zbytečný plýtvání zdrojů. Zobrazením n obrázků na stránce spouštíš aplikaci n + 1×.
Vyčlenit to by neměl být problém. Nevím s jakými proměnnými u obrázku pracuješ (vidím jenom position), ale ty lze posílat přes parametry.
- enumag
- Člen | 2118
motorcb napsal(a):
Poradil by někdo jak to dělat správně?
https://api.nette.org/…ter.php.html#… + https://api.nette.org/…esponse.html
Editoval enumag (21. 10. 2013 9:37)
- enumag
- Člen | 2118
@motorcb: Koukals na ten druhý odkaz? :-P
Jo a jinak tu byly i pokusy o nějakou ImageResponse, když budeš googlit tak možná najdeš i nějakou aktuální. Nicméně FileResponse + Image::__toString() by mělo stačit.
Editoval enumag (21. 10. 2013 11:29)
- motorcb
- Člen | 552
@enumag:
ano, koukal. V presenteru mohu zavolat:
$this->sendResponse( $image->toString() );
Jenže ten mi hlásí: Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must be an instance of Nette\Application\IResponse, string given
Jak z obrázku udělám instanci Nette\Application\IResponse?
- motorcb
- Člen | 552
@jsvelta:
Díky za nakopnutí :-)
Problém ovšem stále přetrvává.
PictureWall.php
use Nette\Image;
class WallPicture extends Nette\Object implements Nette\Application\IResponse
{
public function toString()
{
$image = Image::fromBlank( 500, 300, Image::rgb( 200, 200, 200 ) );
$font_path = '../www/fonts/arial.ttf';
$image->ttfText(20, 0, 10, 100, Nette\Image::rgb(0, 0, 0), $font_path, "Umístění: 1" );
$image->send( Image::PNG );
}
public function send( Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse )
{
}
}
Action:
public function actionUserPicture()
{
$wallPicture = new \WallPicture();
$this->sendResponse( $wallPicture->toString() );
}
Zobrazení obrázku:
<img src="/homepage/user-picture">
Zobrazí obrázek ale hlásí stále chybu: **GET
…/homepage/user-position-picture 500 (Internal Server Error) **
Když zobrazím url v prohlížeči: …/homepage/user-position-picture obázek
se zobrazí bej kakékoliv chyby :-(
- vvoody
- Člen | 910
:D posledné týždne také perly na fóre. Bojím sa ťa poslať do log adresára lebo aj tak by ti ta chybová hláška nič nepovedala. Proste odstráň to volanie toString.
edit: jo aha, ja som sa ani nepozrel na tu tvoju implementáciu IResponse :D celé zle toto. Obsah toString daj do send. Alebo ho tam zavolaj.
Editoval vvoody (21. 10. 2013 17:21)
- jsvelta
- Člen | 39
Skús takto:
use Nette\Image;
use Nette;
class WallPicture extends Nette\Object implements Nette\Application\IResponse
{
public function send( Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse )
{
$image = Image::fromBlank( 500, 300, Image::rgb( 200, 200, 200 ) );
$font_path = '../www/fonts/arial.ttf';
$image->ttfText(20, 0, 10, 100, Nette\Image::rgb(0, 0, 0), $font_path, "Umístění: 1" );
$image->send( Image::PNG );
}
}
Action:
public function actionUserPicture()
{
$wallPicture = new \WallPicture();
$this->sendResponse( $wallPicture );
}
A ešte by som použil $httpResponse->setContentType(‚image/png‘);
- enumag
- Člen | 2118
motorcb napsal(a):
@enumag:
ano, koukal. V presenteru mohu zavolat:
$this->sendResponse( $image->toString() );
Jenže ten mi hlásí: Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must be an instance of Nette\Application\IResponse, string given
Jak z obrázku udělám instanci Nette\Application\IResponse?
No myslel jsem to takhle, to nefunguje?
$this->sendResponse(new FileResonse($image->toString()));