Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Вставка рисунка


Автор: od0201 7.3.2009, 18:53
Всем доброго времени суток
Код

use CGI ':standard';
use GD::Graph::lines;
use strict;

my @data = ([1,2,3,4 ], [66, 58, 92, 83]);

my $mygraph = GD::Graph::lines->new(300, 100);

my $myimage = $mygraph->plot(\@data) or die $mygraph->error;

#print "Content-Type: text/html\n\n";
#print "Текст";
print "Content-type: image/png\n\n";
print $myimage->png;

Работает (рисует), как только убираю комментарий (добавляю текста), выводит бред.
Как одновременно выводить и тект и рисунок?

Автор: od0201 8.3.2009, 01:29
Задачу решил, сохранивши в файл, и прописавшиего файл через тег <IMG ...>, но проблема осталась..

но хотелось бы увидеть решение этой задачи "на лету"

Автор: Unrealm 8.3.2009, 02:24
text/html и image должны разделяться, сначала ты выводишь text/html c, я так понимаю, разметкой, которая может содержать фрагмент типа <img src="image.pl"> и уже в свою очередь image.pl будет выплевывать image/png и все к нему относящееся. 

Автор: tolkien 8.3.2009, 10:24
Правильно делает что выводит вам html(то что вы назвали бредом).

Вы не понимаете как работает протокол http.

Строчка 
print "Content-Type: ...\n\n";
Определяет тип документа. Когда браузер клиента получает данные именно по этой строчке он узнает что это. И обрабатывает соответствующем образом.

Если вы пишите два раза 
print "Content-Type: ...\n\n"; 
указывая разные типы. То самый первый Content-Type будет использован браузером пользователя для определения типа документа.

Автор: od0201 8.3.2009, 14:34
Это я прекрасно понимаю, что проблема не в Perle, а в HTMLе
и эту проблему можно было бы решить, если б знать как завершить
Content-Type:..
и начать новый
Content-Type:..
(я где-то видел что-то типа такого, но не могу найти)
и скорее всего в Реrle есть фунции, которые могут переключать Content-Type  и вставлять картинки.

Цитата

..и уже в свою очередь image.pl будет выплевывать...

1. как ты замелил у меня рисуется график, исходя из предложеного (если оно еще и заработает), мне image.pl придется передавать очень много данных.
2. под каждый новый рисунок писать новую image2..N.pl или еще больше передавать данных в image.pl.
Уж все это слишком громоздко, легче сохранить в файл(его хоть удалить потом можно будет), моя цель сделать как можно проще и оставить как можно меньше мусора после себя

Автор: Unrealm 8.3.2009, 16:41
Если мне не изменяет память, то на лету так не сделать, это должно выполняться не в один заход, все это есть в RFC касательно протокола HTTP.

Автор: tolkien 8.3.2009, 19:50
Правильно сделали. Надо сохранять в картинки в файлы в какой нибудь дериктории. В HTML вставлять только ссылки на них. Убирать мусор. Т.е удалять эти картинки вы можете по разному. Тут уж можете фантазировать сколько хотите. 

Автор: od0201 9.3.2009, 22:52
Столкнулся с еще одной проблемой по этой теме, так я вставляю рисунок
Код

  printf "<p><img src='%s'>",$urg.'gr'.$x.'.png';  

если я делаю другой запрос, у меня меняется вся страница, у меня меняются все данные, у меня меняется рисунок в файле, но на экран выводится старый рисунок, и он обновляется только в том случае, если я жму обновить страницу.
В чем прикол?

Автор: klem4 10.3.2009, 07:55
Кешируется вестимо ?

Автор: od0201 15.3.2009, 21:52
проблему кеширования решил, задовая для каждого графика(рисунка) уникальное имя, 
Код

 my $grn=sprintf "~gr%d%04d.png",$x,int rand(9999);

хотя видел способ отключить кеширования, что будет наверное правельнее, потом попробую

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)