Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод формы+картинка. Не выводится млин... 
:(
    Опции темы
r
Дата 19.5.2005, 06:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Имеем две функции, одна выводит форму другая картинку, не выводятся и форма и картинка одновременно либо одно, либо другое.
#########################################
#!C:\perl\bin\perl -w
use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp 'fatalsToBrowser';
sub forma {
print $cgi->start_html,
$cgi->start_center,
$cgi->start_form,
$cgi->start_table( -border => 0 ),
$cgi->start_Tr;
print $cgi->td( { -width => 600,
-bgcolor => 'green',
-align => 'center' } ,
$cgi->font( { -color => 'white',
-size => '5' },
$cgi->b("Форма"),
),
);
print $cgi->end_Tr,
$cgi->end_table,


$cgi->start_table( -border => 0 ),
$cgi->start_Tr;
print $cgi->td( { -width => 196,
-bgcolor => '#0080C0',
-align => 'center' } ,
$cgi->font( { -color => 'white',
-size => '4' },
$cgi->b("Поле_1"),
),
);

print $cgi->td( { -width => 200,
-bgcolor => '#0080C0',
-align => 'center' } ,

$cgi->textfield( -name => 'name_1',
-size => 25,
),
);
print $cgi->td( { -width => 196,
-bgcolor => '#0080C0',
-align => 'center' } ,
);
print $cgi->end_Tr,
$cgi->end_table,



$cgi->start_table( -border => 0 ),
$cgi->start_Tr;
print $cgi->td( { -width => 196,
-bgcolor => '#0080C0',
-align => 'center' } ,
$cgi->font( { -color => 'white',
-size => '4' },
$cgi->b("Поле_2"),
),
);

print $cgi->td( { -width => 200,
-bgcolor => '#0080C0',
-align => 'center' } ,

$cgi->textfield( -name => 'name_2',
-size => 25,
),
);
print $cgi->td( { -width => 196,
-bgcolor => '#0080C0',
-align => 'center' } ,
);
print $cgi->end_Tr,
$cgi->end_table,


$cgi->start_table( -border => 0 ),
$cgi->start_Tr;
print $cgi->td( { -width => 297,
-bgcolor => '#0080C0',
-align => 'center' } ,

$cgi->submit( -name => 'baton',
-value => 'Отправить' ),

);


print $cgi->td( { -width => 297,
-bgcolor => '#0080C0',
-align => 'center' } ,
$cgi->reset( -value => 'Очистить' ),
);


$cgi->end_form,
print $cgi->end_Tr,
$cgi->end_table,
}

sub grafik{
use GD;
my $number=238756;
my $im = new GD::Image(90,20);
my $white = $im->colorAllocate(255,255,255);
my $black = $im->colorAllocate(0,0,0);
my $red = $im->colorAllocate(255,0,0);
my $blue = $im->colorAllocate(0,150,255);
$im->transparent($white);
$im->interlaced('true');
$im->fill(50,50, $blue);
$im->string(gdGiantFont,15,4,$number,$white);
binmode STDOUT;
print $im->png;

}
print $cgi->header( -charset => 'Windows-1251' );
#forma;
grafik;
exit(0);
############################################
Спасибо.
  Вверх
korob2001
Дата 19.5.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Абсолютно разные типы, форма text/html, а картинка image/png. Вообще-то лучше такие вещи делать в разных файлах, но можно попробовать поизвращаться, правда я этого ещё не пробовал, но думаю получится. Попробуй замени вот эту часть кода:
Код

print $cgi->header( -charset => 'Windows-1251' );
#forma;
grafik; 
exit(0);

на такую:
Код

print $cgi->header( -charset => 'Windows-1251' );

unless ( defined $cgi->param('graf') ) {
      forma();
} else {
      grafik();
}
exit(0);

Затем в подпрограмме forma(), в том месте где хочешь получить график добавь такой код:
Код

print $cgi->img( { -src => $cgi->url( -relative => 1 ) . "?graf=1",
                                     -border => 0 } );

О результатах дай знать, самому интересно, что из этого получится, а тестировать самому времени не хватает. По идее должно сработать.

Удачи.

Это сообщение отредактировал(а) korob2001 - 19.5.2005, 08:25


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 19.5.2005, 19:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в том что это не то что мне нужно, представь себе обычную форму регистрации, таких миллиард, так вот, обычно там присутствует картинка с различными символами, которые необходимо ввести, так сказать защита от автоматической регистрации, и мне нужно вывести и форму и картинку одновременно. Спасибо.
  Вверх
korob2001
Дата 19.5.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



smile
Ты не понял, это именно то, что тебе нужно, ведь форма это и есть HTML, а картинка - это и есть картинка. Для того, что бы выдать картинку в HTML тебе необходимо указать путь к ней в теге:
Код

<img src="путь_к_картинке">

Верно???

Теперь перейдём к алгоритму, того бреда, который я тебе предложил. Ты запускаешь свой скрипт без каких либо параметров, запускается подпрограмма forma();, она выводит форму в браузер, в этой же подпрограмме, мы указываем тег <IMG>, в том месте разметки, где хотим видеть изображение, т.е. втавляем эту строку:
Код

print $cgi->img( { -src => $cgi->url( -relative => 1 ) . "?graf=1",
                                     -border => 0 } );

в подпрограмму forma(). Теперь обрати внимание на атрибут src, вместо того, что бы указать в нём адрес к статическому изображению, мы указываем путь на саму программу, которая в данный момент генерирует форму, т.е. на себя. При этом передаём ей параметр graf=1, получается примерно такой путь: /cgi-bin/script.pl?graf=1, теперь можно перейти в нижнюю часть программы. Из условия видно, что когда подпрограмма получает параметр graf, запускается подпрограмма grafik();. Она тут же генерирует изображение и выводит его в HTML страничку. Другими словами мы получаем на лету сгенерированное изображение, после этого, выполняется оставшаяся часть подпрограммы forma(), т.е. завешается HTML код.

Именно так и выводятся те изображения защиты, о которых ты говоришь. Если ты попробовал запустить этот код и он не сгенерил тебе изображение, то попробуй заменить эту строку:
Код

print $im->png;

на такую:
Код

return $im->png;

Но это только в том случае если не будет работать с print, я просто сейчас не могу тестировать. Если не поможет, дай знать, тогда я установля у себя модуль GD и протестирую твой код.

Удачи.

Это сообщение отредактировал(а) korob2001 - 19.5.2005, 20:59


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 19.5.2005, 21:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да млин, ну у тебя и голова, всё пашет да и ещё как пашет, слушай может это ты этот язык придумал? Да, и расскажи подробнее про способ вставки картинки в страницу с помощью CGI.pm. А то я как раз искал недавно как энто делается и не нашёл. Ещё раз огромное спасибо, сам я точно до этого не скоро дошёл-бы. Пока.
  Вверх
korob2001
Дата 19.5.2005, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата

А то я как раз искал недавно как энто делается и не нашёл.

Мы же только что вставляли в страницу изображение, с помощью CGI.pm
Код

print $cgi->img( { -src => $cgi->url( -relative => 1 ) . "?graf=1",
                                     -border => 0 } );

На в данном случае мы ссылались не на статическое изображение, а на выполняемый скрипт, на себя. Если нужно статическое, то так:
Код

print $cgi->img( { -src => 'путь_к_файлу.jpg',
                      -border => 0,
                      -width => 150,
                      -height => 200 } );

Удачи. smile

Это сообщение отредактировал(а) korob2001 - 19.5.2005, 22:12


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 19.5.2005, 23:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ага а вот и первые проблемы, раньше у меня был такой код, и каждая функция обрабатывала свои параметры(извини опять кнопка код не появилась)
########################################################
print $cgi->header( -charset => 'Windows-1251' );
if ( defined $cgi->param('par_1') ) {
param_1;
} elsif ( defined $cgi->param('par_2') ) {
param_2;
}elsif ( defined $cgi->param('par_3') ) {
param_3;
}elsif ( defined $cgi->param('par_4') ) {
param_4;
} elsif ( defined $cgi->param('par_5') ) {
param_5;
} else {
param_0;
}
######################################################
а теперь пытаюсь переписать и кажется уже запутался, у тебя-же только для двух фун-ий
код, есть-ли какие варианты? Спасибо.
  Вверх
korob2001
Дата 19.5.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата

извини опять кнопка код не появилась

Тебе религия не позволяет зарегиться??? smile Ты уже постоянный посетитель, а зарегиться влом, хотя бы для того, что бы облегчить жизнь другим. smile
Цитата

а теперь пытаюсь переписать и кажется уже запутался, у тебя-же только для двух фун-ий
код, есть-ли какие варианты?

А что мешает создать ещё один блок elsif???
Код

print $cgi->header( -charset => 'Windows-1251' );
if ( defined $cgi->param('par_1') ) {
    param_1; 
} elsif ( defined $cgi->param('par_2') ) {
    param_2;
}elsif ( defined $cgi->param('par_3') ) {
    param_3;
}elsif ( defined $cgi->param('par_4') ) {
    param_4;
} elsif ( defined $cgi->param('par_5') ) {
    param_5;
# Тута.
} elsif ( defined $cgi->param('graf') ) {
    grafik();
} else {
    param_0;
}




--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 12.8.2005, 14:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот еще одна проблемма: не могу положить куки клиенту, это связано с тем как у меня выводится картинка, получается так что кука создается каждый раз как вызывается скрипт(Это если заголовок поменять) или выскакивает ошибка.
Код


#!C:\perl\bin\perl -w
use strict; 
use CGI;
use GD; 
use CGI::Session; 
my $cgi = new CGI;
my $session;
my $id;

sub fun_1{
...
}

sub fun_2{
...
}

sub fun_3{
...
}

sub kook{
$session = new CGI::Session("driver:File", undef, {Directory=>'../publik_html/session/'});
$id=$session->id();
$session->flush();

my $the_cookie = cookie(-name=>"$id", 
           -value=>"$id", 
                  -expires=>'+2h');
                  
print $cgi->header(-cookie=>$the_cookie);
}

sub grafik(){                #Эта фун-ия выводит картинку
my $number=int(rand(223465)); #Вызывается в форме так:
                           # $cgi->img( { -src => $cgi->url (-relative => 1)  . "?graf=1",  -border => 0 } ), 
open(JJ,">../publik_html/session/rand")|| die "file $rand error!!!\n";
print JJ "$number";
close(JJ);
   my  $im = new GD::Image(90,20);
  my  $white = $im->colorAllocate(255,255,255);
   my  $black = $im->colorAllocate(0,0,0);           
   my $blue = $im->colorAllocate(0,150,255);
     $im->transparent($white);
     $im->interlaced('true');
     $im->fill(50,50, $blue);
     $im->string(gdGiantFont,15,4,$number,$black);
    binmode STDOUT;
     print $im->png;     
   }    
   


print $cgi->header('text/html');

if( defined $cgi->param('grafik') ) {
grafik;
}elsif ( defined $cgi->param('fun_1') ) {
fun_1;  
} elsif ( defined $cgi->param('fun_2') ) {
fun_2;  
}else {
fun_3;
}


Ну и как как тут можно куку вставить ума не приложу?
  Вверх
r
Дата 12.8.2005, 16:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Извиняюсь, уже сам дошел, пришлось дописать фун-ию.
Код


sub get_kook{
my $my_kook = cookie("id");
if ($my_kook && "id"){
print $cgi->header('text/html');
}else{
kook();
}
}


  Вверх
r
Дата 31.8.2005, 14:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет korob2001, вот нашел другой вариант как вывести картинку в форме. Причем что самое интересное фиг знает сколько народу читало, и никто не захотел подсказать smile .
Код

sub grafik{
open(DD,'>C:/graf.PNG') || die;
my $ran_d = int(rand(223465));
my $sess_ID = new CGI::Session("driver:File", undef, {Directory=>'../publik_html/session/'});
my $id = $sess_ID -> id();
$sess_ID -> param('rand', "$ran_d");
$sess_ID -> close(); 
my  $im = new GD::Image(90,20);
  my  $white = $im->colorAllocate(255,255,255);
   my  $black = $im->colorAllocate(0,0,0);           
   my $blue = $im->colorAllocate(0,155,255);
     $im->transparent($white);
     $im->interlaced('true');
     $im->fill(50,50, $blue);
     $im->string(gdGiantFont,15,4,$ran_d,$black);
      binmode(DD);
     print DD $im -> png;
     close(DD); 
   };    

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

  Вверх
korob2001
Дата 31.8.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Не понял, а что именно не понятно?
Если ты хочешь вывести это изображение сразуже в STDOUT, просто создай условие по которому будет запускаться эта подпрограмма.
Кстати: Зачем ты сохраняешь всю эту канитель в файл, просто генерируй его и налету выдавай в STDOUT. Или тебе необходимо создать именно файл изображения? Но опять же, зачем?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 1.9.2005, 10:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Понимаешь, мне так проще намного, дело в том что когда скрипт выдавал форму, он вызывал еще и эту функцию, и приходилось выдумывать много. Что-бы создать например сессию и что-бы она не вызывалась дважды, ну и много еще всяких моментов. Потом проще удалить картинку и все. Спасибо.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.