Forum Webscript.Ru
Программирование => Perl => Тема начата: от 20 Апреля 2001, 20:44:52
-
Буду очень признателен, если Вы подскажете решение задачи:
Дано:
картинка
Задача:
считать картинку в переменную Perl.
Это нужно для записи картинки в БД MySQL.
Заранее благодарен.
-
Sergei (20-04-2001 20:44):
Буду очень признателен, если Вы подскажете решение задачи:
Дано:
картинка
Задача:
считать картинку в переменную Perl.
Это нужно для записи картинки в БД MySQL.
Заранее благодарен.
А в чем проблемы? RTFM в районе \'read\'
На вскидку:
если у тебя в таблице только что-то типа id int unsigned auto increment и image mediumblob, то это делается так:
require Symbol;
# Имя имага
my $filename = "image.jpg";
my $FH = Symbol::gensym();
unless(open($FH, $filename))
{
die("Couldn\'t open file \'$filename\' --> $!");
}
# Для ушлых систем
binmode($FH);
my $content = "";
while(read($FH, my $buffer, 8192))
{
$content .= $buffer;
}
close($FH);
# $dbh - это хэндл соеденения с БД, полученный где-то там...
$content = $dbh->quote($content);
# $T_Name - название таблицы
my $T_Name = "images";
my $QUERY = qq~INSERT INTO $T_Name (image) VALUES ($content)~;
unless($dbh->do($QUERY))
{
die("Couldn\'t do the \'INSERT\' clause --> $DBI::errstr");
}
# Идентификатор вновь созданной строки
my $id = $dbh->{\'mysql_insertid\'};
# Ну, как-бы, все.....
-
Огромное спасибо, cj, за грамотный и оперативный совет. К своему стыду, я так и не смог им воспользоваться, т.к. не знаю, как установить модули для Perl.
ОС: Windows 98
Установлен: ActivePerl 5.60.0 Build 613 в каталог e:\\usr\\local\\bin
При установке он прописал в autoexec.bat путь e:\\usr\\local\\bin\\
Как пытался установить (модули DBI и Symbol):
1). Скачал из CPAN модуль DBI-1.14.tar.gz и распаковал его.
Запустил команду
perl makefile.PL
скрипт запустился, немного подумал, и стал ругаться, что не может найти Perl в каталоге e:\\usr\\local\\bin, хотя он там есть.
2). Пробовал загрузить автоматически из интернета с помощью ppm.bat
подключился к Интернету;
после ввода search Symbol
ppm.bat стал ругаться:
HTTP POST failed: 500 (Unknown error, <> line 1,), in SOAP method call. Content of response: at E:/USR/local/site/lib/PPM/SOAPClient.pm line 222, хотя вроде при установке я его настраивал;
3). Пробовал установить с помощью команды perl -MCPAN -e shell,
Ругается на то, что не может найти зеркало CPAN\'а.
Не нашел: nmake, gzip, lynx, ncftget, ncftp,
Кончилось тем, что скачал модули DBI и DBD::Mysql с сайта ActivePerl в формате zip, и они нормально установились и работают. А вот Symbol у меня не установлен, а на сайте Active Perl его нет.
Поэтому попробовал просто считать картинку и проверить так:
#!/usr/bin/perl -w
open(IMAGE, "art0029.gif");
binmode(IMAGE);
my $content = "";
while(read(IMAGE, my $buffer, 8192))
{
$content .= $buffer;
}
close(IMAGE);
print "Content-Type: image/gif
";
print $content;
exit;
Работает, но некорректно: или обрезает картинку, или вообще искажает до неузнаваемости. Подскажите, пожалуйста, как быть?
Спасибо!
-
Я все сам компилил, поэтому не знаю, как устанавливать доп. модули. IMHO на сайте http://perl.apache.org уже лежит поставка (откомпилированная) с DBI. А по поводу того, что выдает коряво, надо написать binmode(STDIO)
-
Еще раз спасибо, cj!
Ты, конечно же, имел в виду binmode(STDOUT) ?
Такой скрипт работает отлично:
#!/usr/bin/perl -w
open(IMAGE, "image.jpg");
binmode(IMAGE);
$data = "";
while (read(IMAGE, $buff, 1)) {
$data .= $buff;
}
close IMAGE;
binmode(STDOUT);
print "Content-Type: image/jpeg
";
print $data;
exit;
Теперь, когда картинка гарантированно коректно считывается в переменную, буду разбираться с MySQL...