powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perl фунция
31 сообщений из 31, показаны все 2 страниц
Perl фунция
    #35200265
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел на этом форуме функцию для скачки файла с сервера, вот она:
-- Function: file_read2(text, int4, int4)

-- DROP FUNCTION file_read2(text, int4, int4);
CREATE OR REPLACE FUNCTION file_read2(text, int4, int4)
RETURNS bytea AS
$BODY$
my $file = @_[0]; # Имя файла
my $start_pos = @_[1]; # Смещение от начала
my $length = @_[2]; # Прочесть кол-во байт

my $f,$s,$v,$ret;
my $c;

$ret = '';
#$c = 0;

open($f,"<".$file);
seek($f,$start_pos,1);
binmode($f);
while($length > 0)
{
read($f,$s,1);
$v = unpack("C",$s);
if ( ($v>=0 && $v<=31) || ($v>=127 && $v<=255) || ($v==39) || ($v==92))
{
my $substr;
$substr = sprintf("%03o",$v);
$ret .= "\\".$substr;
}
else
{
$ret .= $s;
}
$length--;
} # while


close($f);

return ($ret);

$BODY$
LANGUAGE 'plperlu' VOLATILE;
ALTER FUNCTION file_read2(text, int4, int4) OWNER TO postgres;

Может ли кто нибудь помочь написать функцию для загрузки файла на сервер.
...
Рейтинг: 0 / 0
Perl фунция
    #35202156
Nod64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function save_file(filename text, data bytea)
returns void language plperlu as $body$
  use strict;
  my ($filename, $data) = @_;
  $data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
  open my $f, '>', $filename or die "can't create file '$filename'";
  print $f $data;
$body$;
revoke execute on function save_file(filename text, data bytea) from public;
Для чтения/записи текстовых файлов в пределах серверного каталога есть контриб adminpack.
...
Рейтинг: 0 / 0
Perl фунция
    #35202208
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Нашел на этом форуме функцию для скачки файла с сервера, вот она:Если вы цитируете, то указывайте автора, а лучше ссылку на первоисточник.
Также нужно использовать тэг SRC.
...
Рейтинг: 0 / 0
Perl фунция
    #35202388
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь если обидел:
Serik Akhmetov
Код: 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.
-- Function: file_read2(text, int4, int4)

-- DROP FUNCTION file_read2(text, int4, int4);
CREATE OR REPLACE FUNCTION file_read2(text, int4, int4)
RETURNS bytea AS
$BODY$
my $file = @_[ 0 ]; # Имя файла
my $start_pos = @_[ 1 ]; # Смещение от начала
my $length = @_[ 2 ]; # Прочесть кол-во байт

my $f,$s,$v,$ret;
my $c;

$ret = '';
#$c =  0 ;

open($f,"<".$file);
seek($f,$start_pos, 1 );
binmode($f);
while($length >  0 )
{
read($f,$s, 1 );
$v = unpack("C",$s);
if ( ($v>= 0  && $v<= 31 ) || ($v>= 127  && $v<= 255 ) || ($v== 39 ) || ($v== 92 ))
{
my $substr;
$substr = sprintf("%03o",$v);
$ret .= "\\".$substr;
}
else
{
$ret .= $s;
}
$length--;
} # while


close($f);

return ($ret); 

$BODY$
LANGUAGE 'plperlu' VOLATILE;
ALTER FUNCTION file_read2(text, int4, int4) OWNER TO postgres;


Serik Akhmetov , а вы не могли бы мне помочь? Буду очень благодарен.
...
Рейтинг: 0 / 0
Perl фунция
    #35202398
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nod64
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function save_file(filename text, data bytea)
returns void language plperlu as $body$
  use strict;
  my ($filename, $data) = @_;
  $data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
  open my $f, '>', $filename or die "can't create file '$filename'";
  print $f $data;
$body$;
revoke execute on function save_file(filename text, data bytea) from public;
Для чтения/записи текстовых файлов в пределах серверного каталога есть контриб adminpack.

Спасибо, но этот способ подходит только для текстовых файлов, а как сделать что бы нормально загружались *.exe и т.п.?
...
Рейтинг: 0 / 0
Perl фунция
    #35202692
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nod64 предложил хорошее решение, если у вас портятся бинарные файлы, попробуйте добавить
Код: plaintext
binmode($f);
после открытия файла, а в конце еще
Код: plaintext
close($f);
...
Рейтинг: 0 / 0
Perl фунция
    #35202709
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik AkhmetovNod64 предложил хорошее решение, если у вас портятся бинарные файлы, попробуйте добавить
Код: plaintext
binmode($f);
после открытия файла, а в конце еще
Код: plaintext
close($f);


Сделал, но размер закачанного файл слегка превышает оригинал. Лишняя информация записывается файл.
...
Рейтинг: 0 / 0
Perl фунция
    #35202736
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что у меня получилось, но размер файла больше чем у оригинала и естественно не работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace function save_file(filename text, data bytea)
returns void language plperlu as $body$
  use strict;
  my ($filename, $data) = @_;
  $data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
  open my $f, '>', $filename or die "can't create file '$filename'";
  binmode($f);
  print $f $data;
  close($f);
$body$;
revoke execute on function save_file(filename text, data bytea) from public;
...
Рейтинг: 0 / 0
Perl фунция
    #35202789
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При передаче bytea все не ascii символы кодируются восьмеричными числом \\ХХХ
разберитесь, что в коде Nod64 делает строка
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
подозреваю, что дело в обратной расскодировке bytea.
...
Рейтинг: 0 / 0
Perl фунция
    #35202911
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik AkhmetovПри передаче bytea все не ascii символы кодируются восьмеричными числом \\ХХХ
разберитесь, что в коде Nod64 делает строка
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
подозреваю, что дело в обратной расскодировке bytea.

Народ, может кто нибудь объяснить что делать вот этот фрагмент кода
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
. Опыта работы с Perl не имею, но проблему очень хочется решить.
...
Рейтинг: 0 / 0
Perl фунция
    #35202942
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Народ, может кто нибудь объяснить что делать вот этот фрагмент кода
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
везде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счисления
...
Рейтинг: 0 / 0
Perl фунция
    #35203015
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat Garik888Народ, может кто нибудь объяснить что делать вот этот фрагмент кода
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
везде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счисления

Почему же тогда файл на выходе имеет больший размер? что не так?
...
Рейтинг: 0 / 0
Perl фунция
    #35203155
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatвезде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счислениянужно заменять 2 слэша , я в regexp тоже не силен, может так
Код: plaintext
1.
2.
3.
4.
5.
$data =~ s !
                  \\\\(\d{ 3 }) 
                ! 
                  chr(oct($ 1 ))
                !
                 eg;
:)
...
Рейтинг: 0 / 0
Perl фунция
    #35203181
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik Akhmetov LeXa NalBatвезде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счислениянужно заменять 2 слэша , я в regexp тоже не силен, может так
Код: plaintext
1.
$data =~ s!\\\\(\d{ 3 })!chr(oct($ 1 )) !eg;
:)

Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.
...
Рейтинг: 0 / 0
Perl фунция
    #35203188
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так
Код: plaintext
1.
2.
3.
4.
5.
$data =~ s !
                  (\\\d{ 3 }) 
                ! 
                  chr(oct($ 1 ))
                !
                 eg;
:)
...
Рейтинг: 0 / 0
Perl фунция
    #35203201
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.Лучше всего спросить автора, или в ветке по Perl.
...
Рейтинг: 0 / 0
Perl фунция
    #35203223
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nod64
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function save_file(filename text, data bytea)
returns void language plperlu as $body$
  use strict;
  my ($filename, $data) = @_;
  $data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
  open my $f, '>', $filename or die "can't create file '$filename'";
  print $f $data;
$body$;
revoke execute on function save_file(filename text, data bytea) from public;
Для чтения/записи текстовых файлов в пределах серверного каталога есть контриб adminpack.
Nod64 можешь написать в чем может быть проблема в твоей функции? Она закачивает на сервер бинарный файл большего размера чем он на самом деле ну и естественно он не работает.
...
Рейтинг: 0 / 0
Perl фунция
    #35203298
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serik Akhmetovили в ветке по Perlперловики вряд ли знакомы с постгресовским типом bytea, и как его надо перекодировать :-(
...
Рейтинг: 0 / 0
Perl фунция
    #35203379
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888 Serik Akhmetov$data =~ s!\\\\(\d{3})!chr(oct($1)) !eg;Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.так кажется должно работать. попробуйте вместе с binmode.
...
Рейтинг: 0 / 0
Perl фунция
    #35203396
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat Garik888 Serik Akhmetov$data =~ s!\\\\(\d{3})!chr(oct($1)) !eg;Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.так кажется должно работать. попробуйте вместе с binmode.

binmode у меня стоит, но эта функция вооще ничего не заменяет.
Даже не знаю что делать вроде все работает с этой строчкой
Код: plaintext
$data =~ s!\\(\d{ 3 })!chr(oct($ 1 )) !eg;
, но файл немного большего размера.
...
Рейтинг: 0 / 0
Perl фунция
    #35203410
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Даже не знаю что делать вроде все работает с этой строчкой
Код: plaintext
$data =~ s!\\(\d{ 3 })!chr(oct($ 1 )) !eg;
, но файл немного большего размера.Я тоже проверил, :)
regexp правильный.
Сделайте небольшой тестовый файл, и сравните, что появляется лишнее.

Как вы передаете файл, на чем написан клиент ?
...
Рейтинг: 0 / 0
Perl фунция
    #35203432
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik Akhmetov Garik888Даже не знаю что делать вроде все работает с этой строчкой
Код: plaintext
$data =~ s!\\(\d{ 3 })!chr(oct($ 1 )) !eg;
, но файл немного большего размера.Я тоже проверил, :)
regexp правильный.
Сделайте небольшой тестовый файл, и сравните, что появляется лишнее.

Как вы передаете файл, на чем написан клиент ?

Я передаю файл calculator.exe размером 180224, на сервере он уже имеет размер 180353.
Использую я клиент написанный на Delphi 2007 используя Zeos компонент, файл передается как blob поле.
...
Рейтинг: 0 / 0
Perl фунция
    #35203492
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bytea и blob это не одно и тоже,
создайте таблицу с bytea,
и попробуйте записать в нее, может дело в компонентах ?
...
Рейтинг: 0 / 0
Perl фунция
    #35203559
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serik Akhmetovнужно заменять 2 слэша слэш должен быть один, второй нужен для Perl
...
Рейтинг: 0 / 0
Perl фунция
    #35203625
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik Akhmetovbytea и blob это не одно и тоже,
создайте таблицу с bytea,
и попробуйте записать в нее, может дело в компонентах ?

В клиенте у меня тип bytea определяется как blob, и я думаю с этим не может быть проблем т.к. первая функция которая тащит файл с сервера реализована у меня тоже через blob, и все работает как часы.
...
Рейтинг: 0 / 0
Perl фунция
    #35203786
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я обнаружил, что в отправленных данных слеши не переводятся в формат типа \000. А при разборке файла функцией возникают двойные слеши из за которых и растет файл. Кто нибудь может помочь решить эту проблему?
...
Рейтинг: 0 / 0
Perl фунция
    #35203897
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал создать текстовый файл содержащий текст "привет\как\дела\?" при пересылке он выдавал мне вот что "привет\\как\\дела\\?".
Как можно переделать скриптик???
...
Рейтинг: 0 / 0
Perl фунция
    #35203966
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Пробовал создать текстовый файл содержащий текст "привет\как\дела\?" при пересылке он выдавал мне вот что "привет\\как\\дела\\?".
Как можно переделать скриптик???добавить замену двух подряд идущих слэшей на один
...
Рейтинг: 0 / 0
Perl фунция
    #35204005
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat Garik888Пробовал создать текстовый файл содержащий текст "привет\как\дела\?" при пересылке он выдавал мне вот что "привет\\как\\дела\\?".
Как можно переделать скриптик???добавить замену двух подряд идущих слэшей на один
Это не поможет, т.к. там может быть и 2 и 100. Просто система рзборки в функции не справляется с разборкой, вот и возникают такие проблемы.
...
Рейтинг: 0 / 0
Perl фунция
    #35204087
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garik888Это не поможет, т.к. там может быть и 2 и 100.perl -e 'my $slash="\\"; my $foo=$slash x 100; printf "%d\n",length($foo); $foo=~s#\\\\#\\#g; printf "%d\n",length($foo);'
...
Рейтинг: 0 / 0
Perl фунция
    #35209056
Garik888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat Garik888Это не поможет, т.к. там может быть и 2 и 100.perl -e 'my $slash="\\"; my $foo=$slash x 100; printf "%d\n",length($foo); $foo=~s#\\\\#\\#g; printf "%d\n",length($foo);'
Это совсем не то что нужно.

После некоторых манипуляций получился вот такой скриптик, который и работает как надо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace function save_file(filename text, data bytea)
returns void language plperlu as $body$
  use strict;
  my ($filename, $data) = @_;
 $data =~ s!\\\\!'\\'!eg;
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
  open my $f, '>', $filename or die "can't create file '$filename'";
  binmode $f;
  print $f $data;
  close $f;
$body$;
revoke execute on function save_file(filename text, data bytea) from public;
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perl фунция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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