Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вывод картинок в PERL / 18 сообщений из 18, страница 1 из 1
01.06.2004, 09:45
    #32542008
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Всем доброго времени суток!

Не могу решить проблему, хотя сам понимаю,
что решение ее простое, но какое незнаю.

Есть у меня база данных, а вернее таблица в ней,
котороя хранит в себе картинки.

DROP TABLE IF EXISTS `MyImage`;
CREATE TABLE `MyImage`
(
`ID` bigint(20) unsigned zerofill NOT NULL auto_increment,
`SelfImage` longblob NOT NULL,
PRIMARY KEY (`ID`)
)
TYPE=MyISAM COMMENT='MyImage';

При помощи скрипта на PERL , из файла в нее записывается картинка,
в поле `SelfImage`, в этом аопросов нет. Но мне надо ее вывести потом клиенту, а как это сделать ?

Делаю запрос вида :

SELECT * FROM `MyImage`
WHERE `ID`= 00000000000000000001 ;

При этом я получаю ID, SelfImage, далее `SelfImage` я перевожу в
строку, и после этого вывожу ее клиенту через print, ожидая,
что в IE отобразится картинка, но вместо картинки билеберда в виде
текста, а не картинки....

Помогите, пожалусто, как все таки правильно выводить картинки ?
Если у когото есть малюсенький скрипт, буду поистине Вам благодарен,
если Вы его предоставите в качестве поучительного примера.....

С тем самым прикладываю таблицу, в zip архиве, ее достаточно скопировать в
./data/test/

Заранее благодарю.





-----------------------------------------------------------
С уважением,MySQLdb
...
Рейтинг: 0 / 0
01.06.2004, 10:21
    #32542133
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
MySQLdbвывожу ее клиенту через print, ожидая,
что в IE отобразится картинка, но вместо картинки билеберда в виде
текста, а не картинки....потому что хидеры, судя по всему, не выводишь.
...
Рейтинг: 0 / 0
01.06.2004, 10:28
    #32542147
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Код: plaintext
потому что хидеры, судя по всему, не выводишь.

А какие именно надо, может есть примерчик работоспособный ?

-----------------------------------------------------------
С уважением,MySQLdb
...
Рейтинг: 0 / 0
01.06.2004, 10:39
    #32542178
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Content-Type: image/jpeg
Если хочешь поберечь клиента и допускаешь кэширование рисунков на его стороне, так же полезным будет при запросе анализировать хидеры If-Modified-Since и If-None-Match (если совпало - возвращаешь HTTP/1.0 304 Not Modified и картинку клиенту не отдаёшь) и формировать хидеры Last-Modified и ETag
Примера на perl'е дать не могу - вспоминать слишком долго - с некоторых пор предпочитаю PHP ;)
...
Рейтинг: 0 / 0
01.06.2004, 14:06
    #32542810
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Да, внутри картинки формата jpg
...
Рейтинг: 0 / 0
02.06.2004, 08:47
    #32543912
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Вот код, который я использую:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#!/usr/local/perl/bin/perl -w
use DBI;
use CGI::Carp qw(fatalsToBrowser);
use strict; 
my $database = "test"; 
my $data_source = "DBI:mysql:$database"; 
my $username = "root"; 
my $password = "getrootpass"; 
my $dbh = DBI->connect( $data_source, $username, $password) ;
my $str=$DBI::errstr;
 if ($str ne '') 
   {
    print("$str");
   }
   my $sth= $dbh->prepare("SELECT * FROM `MyImage` WHERE `ID`= 00000000000000000001 ");
   $sth->execute();
   my @row = $sth->fetchrow_array;
   my $row_id.="$row[0]";
   my $row_imageself.="$row[1]";
   print("Content-type: image/jpeg\n\n");
   print("$row_imageself");
 
$dbh->disconnect; 
exit( 0 ); 
__END__ 
...
Рейтинг: 0 / 0
02.06.2004, 13:56
    #32544709
Макс М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
MySQLdb
закомментируй в скрипте строку с хедером :
#print("Content-type: image/jpeg\n\n");
или поменяй на text/html

и посмотри что выводится в броузер


ЗЫ
в броузере набирай не тот URL где у тебя HTML c <img src="путь к твоему скрипту"> а именно вводи URL этого скрипта
...
Рейтинг: 0 / 0
02.06.2004, 14:39
    #32544823
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
в строке адреса пишу http://localhost/cgi-bin/image.pl

в скрипте заменил

#print("Content-type: image/jpeg\n\n");
print("Content-type: text/html\n\n");

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

внутри выводится три буквы

Content-type: text/html

ÿØÿá

-----------------------------------------------------------
С уважением,MySQLdb
...
Рейтинг: 0 / 0
02.06.2004, 16:54
    #32545163
Макс М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
а каким редактором ты смотришь, когда он тебе 3 буквы показывает ?
Похоже он сам их интерпретирует как unicode или что-то вроде этого.

Ты уверен что у тебя картинка в $row[1] ?
попробуй $row[1] записать в файл и посмотри, картинка ли это ?
...
Рейтинг: 0 / 0
02.06.2004, 17:22
    #32545232
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
автора каким редактором ты смотришь, когда он тебе 3 буквы показывает ?
Похоже он сам их интерпретирует как unicode или что-то вроде этого.

Ты уверен что у тебя картинка в $row[1] ?
попробуй $row[1] записать в файл и посмотри, картинка ли это ?

смотрю из под Perl Builder, а если кликнуть в окне IE, как HTML исходник,
то там лежит типа "ящяа".

Переменная $row[1] содержит в себе после запроса "ÿØÿá",
это попадает в файл, и в окно браузера, типа поле не полностью зачиталось в массив, а только его кусочек.

Возьми базу, попробуй сам.
...
Рейтинг: 0 / 0
02.06.2004, 17:49
    #32545308
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
MySQLdbесли кликнуть в окне IE, как HTML исходник,
то там лежит типа "ящяа".Может всё же "ящяб"? ;) Это и есть начало твоего jpg-файла, если у тебя всё же "ящяа" - ищи костыли при доставании данных из БД, потому что твой JPEG начинается именно с 0xFF 0xD8 (маркер SOI - Start Of Image) 0xFF 0xE1 (маркер APP1 - начало EXIF-данных) ну и т.д.
...
Рейтинг: 0 / 0
03.06.2004, 10:23
    #32545959
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
авторМожет всё же "ящяб"? ;) Это и есть начало твоего jpg-файла, если у тебя всё же "ящяа" - ищи костыли при доставании данных из БД, потому что твой JPEG начинается именно с 0xFF 0xD8 (маркер SOI - Start Of Image) 0xFF 0xE1 (маркер APP1 - начало EXIF-данных) ну и т.д.

Да, именно так, "ящяб", описался. Я уже начинаю подозревать,
что при запросе из поля BLOB данные не считываются полностью,
а как их считаь полностью, незнаю. Или этому может быть есть кокое-то объяснение, или в самом DBD/DBI есть какоето ограничение?

Тогда возможно ли вообще как либо вывести картинку из базы,
или ее только можно туда поместить, и забыть про нее навсегда ?
...
Рейтинг: 0 / 0
03.06.2004, 10:29
    #32545977
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Попробуй всё же поступить так, как сказал Макс М. - запиши переменную в файл, посмотри его содержимое просмотрщиком. Подозреваю, что ты просто ловишь воздух.
...
Рейтинг: 0 / 0
03.06.2004, 14:14
    #32546647
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
пишу в файл, в двоичном виде, потом открываю в ACDC,
просматривается картинка. А вот вывести ее из файла пользователю не получается, в чем ошибка незнаю, выводится только "ящяб",
помоготе плиз вывести из файла.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#!/usr/local/perl/bin/perl -w
use DBI;
use CGI::Carp qw(fatalsToBrowser);
use strict; 
use FileHandle;

my $database = "test"; 
my $data_source = "DBI:mysql:$database"; 
my $username = "root"; 
my $password = "viton"; 
my $dbh = DBI->connect( $data_source, $username, $password) ;
my $str=$DBI::errstr;
 if ($str ne '') 
   {
    print("$str");
   }
   my $sth= $dbh->prepare("SELECT  `SelfImage` FROM `MyImage` WHERE `ID`= 00000000000000000003");
   $sth->execute();
   my @row = $sth->fetchrow_array;
   my $row_imageself.="$row[0]";

   open my $MyFh, '>', "image.jpg";
   binmode $MyFh , ":raw";
   print  $MyFh  "$row_imageself";
   close($MyFh);

  print("Content-type: image/jpeg\n\n");

  open  my $MyFh_, '<', "image.jpg";
  while( read  $MyFh_ , my $Myrow_imageself ,  1024  )
       {
        print   "$Myrow_imageself";
        }		
  close($MyFh_);

  
$dbh->disconnect; 
exit( 0 ); 
__END__ 



-----------------------------------------------------------
С уважением,MySQLdb
...
Рейтинг: 0 / 0
03.06.2004, 14:58
    #32546806
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
MySQLdb , до хидера выводить что-то кроме хидеров - не нужно. Картинку нужно выводить после хидера, при чём между картинкой и хидерами не может быть ничего, кроме хидеров.
Уберите у себя строку
Код: plaintext
print("$str");
- возможно, дело в этом.
...
Рейтинг: 0 / 0
03.06.2004, 15:21
    #32546893
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
У меня затырка на

Код: plaintext
1.
2.
3.
4.
5.
open  my $MyFh_, '<', "image.jpg";
  while( read  $MyFh_ , my $Myrow_imageself ,  1024  )
       {
        print   "$Myrow_imageself";
        }		
  close($MyFh_);

не читается полностью файл,
цикл делает только один проход, вот и получается "ящаб".

Как правильно организовать цикл ?
...
Рейтинг: 0 / 0
04.06.2004, 13:48
    #32548566
MySQLdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
Вот уж воистину иногда сам себя заводиш в тупик,
а тем временем ларчик очень просто открывался,
и вот как я решил эту проблему тремя способами:

1)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
#!/usr/local/perl/bin/perl -w

# ***************************************
use DBI; 
use CGI::Carp qw(fatalsToBrowser);
use strict; 
use FileHandle;
# ***************************************

my $database = "test"; 
my $data_source = "DBI:mysql:$database"; 
my $username = "root"; 
my $password = "vita44onir"; 
my $dbh = DBI->connect( $data_source, $username, $password) ;
# ***************************************

my $str=$DBI::errstr;
if ($str ne '') 
   {
    print("$str");
	exit( 1 );
   }
   else
       {
	      # ***************************************
          my $sth= $dbh->prepare("SELECT  `SelfImage` FROM `MyImage` WHERE `ID`= 00000000000000000001");
          $sth->execute();
          my @row = $sth->fetchrow_array;
          my $row_imageself.="$row[0]";
		  # ***************************************

          open my $MyFh, '>', "image.jpg";
          binmode $MyFh , ":raw";
          print  $MyFh  "$row_imageself";
          close($MyFh);
		  # ***************************************

          binmode STDOUT;
          #print("Content-type: image/jpeg\n\n");
          print("Content-type: text/html\n\n");
          print  "$row_imageself";
		  # ***************************************
        
  
          $dbh->disconnect; 
          exit( 0 );
		}  
__END__ 





2)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
#!/usr/local/perl/bin/perl -w

# ***************************************
use DBI;
use GD; 
use CGI::Carp qw(fatalsToBrowser);
use strict; 
use FileHandle;
# ***************************************

my $database = "test"; 
my $data_source = "DBI:mysql:$database"; 
my $username = "root"; 
my $password = "vita44onir"; 
my $dbh = DBI->connect( $data_source, $username, $password) ;
# ***************************************

my $str=$DBI::errstr;
if ($str ne '') 
   {
    print("$str");
	exit( 1 );
   }
   else
       {
	      # ***************************************
          my $sth= $dbh->prepare("SELECT  `SelfImage` FROM `MyImage` WHERE `ID`= 00000000000000000001");
          $sth->execute();
          my @row = $sth->fetchrow_array;
          my $row_imageself.="$row[0]";
		  # ***************************************

          open my $MyFh, '>', "image.jpg";
          binmode $MyFh , ":raw";
          print  $MyFh  "$row_imageself";
          close($MyFh);
		  # ***************************************

          #binmode STDOUT;
          #print("Content-type: image/jpeg\n\n");
          #print("Content-type: text/html\n\n");
          #print  "$row_imageself";
		  # ***************************************
		  
		  my $myImage = newFromJpeg GD::Image('image.jpg');
		  binmode STDOUT;
          #print("Content-type: image/jpeg\n\n");
          print("Content-type: text/html\n\n");
		  print $myImage->jpeg( 100 );
		  # ***************************************		  
        
		
		
  
          $dbh->disconnect; 
          exit( 0 );
		}  
__END__ 

3)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
#!/usr/local/perl/bin/perl -w

# ***************************************
use DBI;
use GD; 
use CGI::Carp qw(fatalsToBrowser);
use strict; 
use FileHandle;
# ***************************************

my $database = "test"; 
my $data_source = "DBI:mysql:$database"; 
my $username = "root"; 
my $password = "vita44onir"; 
my $dbh = DBI->connect( $data_source, $username, $password) ;
# ***************************************

my $str=$DBI::errstr;
if ($str ne '') 
   {
    print("$str");
	exit( 1 );
   }
   else
       {
	      # ***************************************
          my $sth= $dbh->prepare("SELECT  `SelfImage` FROM `MyImage` WHERE `ID`= 00000000000000000002");
          $sth->execute();
          my @row = $sth->fetchrow_array;
          my $row_imageself.="$row[0]";
		  # ***************************************

          open my $MyFh, '>', "image.png";
          binmode $MyFh , ":raw";
          print  $MyFh  "$row_imageself";
          close($MyFh);
		  # ***************************************

          #binmode STDOUT;
          #print("Content-type: image/jpeg\n\n");
          #print("Content-type: text/html\n\n");
          #print  "$row_imageself";
		  # ***************************************
		  
		  my $myImage = newFromPng GD::Image('image.png');
		  binmode STDOUT;
          #print("Content-type: image/jpeg\n\n");
          print("Content-type: text/html\n\n");
		  print $myImage->png;
		  # ***************************************		  
        
		
		
  
          $dbh->disconnect; 
          exit( 0 );
		}  
__END__ 

С тем самым прикладываю исходини PL.
-----------------------------------------------------------
С уважением,MySQLdb
...
Рейтинг: 0 / 0
03.07.2004, 14:58
    #32588203
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод картинок в PERL
А всего то надо было поставить перед выводом изображения binmode(STDOUT) - иначе происходит преобразование \n в \r\n
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вывод картинок в PERL / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]