Автор Тема: Как считать двоичный файл в скалярную переменную Perl?  (Прочитано 3608 раз)

0 Пользователей и 1 Гость просматривают эту тему.

  • Гость
Буду очень признателен, если Вы подскажете решение задачи:
Дано:
картинка
Задача:
считать картинку в переменную Perl.
Это нужно для записи картинки в БД MySQL.

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

Оффлайн cj

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 48
  • +0/-0
  • 0
    • Просмотр профиля
    • http://netcode.lgg.ru/
Цитировать
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\'};

# Ну, как-бы, все.....
Here comes the pain...
http://netcode.lgg.ru/

  • Гость
Огромное спасибо, 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;

Работает, но некорректно: или обрезает картинку, или вообще искажает до неузнаваемости. Подскажите, пожалуйста, как быть?

Спасибо!

Оффлайн cj

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 48
  • +0/-0
  • 0
    • Просмотр профиля
    • http://netcode.lgg.ru/
Я все сам компилил, поэтому не знаю, как устанавливать доп. модули. IMHO на сайте http://perl.apache.org уже лежит поставка (откомпилированная) с DBI. А по поводу того, что выдает коряво, надо написать binmode(STDIO)
Here comes the pain...
http://netcode.lgg.ru/

  • Гость
Еще раз спасибо, 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...

 

Sitemap 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