Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perl фунция / 25 сообщений из 31, страница 1 из 2
19.03.2008, 12:54
    #35200265
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Нашел на этом форуме функцию для скачки файла с сервера, вот она:
-- 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
20.03.2008, 04:08
    #35202156
Nod64
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Код: 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
20.03.2008, 07:02
    #35202208
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Garik888Нашел на этом форуме функцию для скачки файла с сервера, вот она:Если вы цитируете, то указывайте автора, а лучше ссылку на первоисточник.
Также нужно использовать тэг SRC.
...
Рейтинг: 0 / 0
20.03.2008, 09:32
    #35202388
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Извиняюсь если обидел:
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
20.03.2008, 09:35
    #35202398
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
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
20.03.2008, 10:58
    #35202692
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Nod64 предложил хорошее решение, если у вас портятся бинарные файлы, попробуйте добавить
Код: plaintext
binmode($f);
после открытия файла, а в конце еще
Код: plaintext
close($f);
...
Рейтинг: 0 / 0
20.03.2008, 11:03
    #35202709
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Serik AkhmetovNod64 предложил хорошее решение, если у вас портятся бинарные файлы, попробуйте добавить
Код: plaintext
binmode($f);
после открытия файла, а в конце еще
Код: plaintext
close($f);


Сделал, но размер закачанного файл слегка превышает оригинал. Лишняя информация записывается файл.
...
Рейтинг: 0 / 0
20.03.2008, 11:10
    #35202736
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Вот что у меня получилось, но размер файла больше чем у оригинала и естественно не работает.
Код: 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
20.03.2008, 11:22
    #35202789
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
При передаче bytea все не ascii символы кодируются восьмеричными числом \\ХХХ
разберитесь, что в коде Nod64 делает строка
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
подозреваю, что дело в обратной расскодировке bytea.
...
Рейтинг: 0 / 0
20.03.2008, 11:50
    #35202911
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
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
20.03.2008, 11:57
    #35202942
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Garik888Народ, может кто нибудь объяснить что делать вот этот фрагмент кода
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
везде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счисления
...
Рейтинг: 0 / 0
20.03.2008, 12:12
    #35203015
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
LeXa NalBat Garik888Народ, может кто нибудь объяснить что делать вот этот фрагмент кода
Код: plaintext
$data =~ s!\\(\d{ 3 })! chr(oct($ 1 )) !eg;
везде заменяет слэш и следующие за ним три цифры на символ, соответствующий коду из этих трех цифр в восьмеричной системе счисления

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

Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.
...
Рейтинг: 0 / 0
20.03.2008, 12:54
    #35203188
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
или так
Код: plaintext
1.
2.
3.
4.
5.
$data =~ s !
                  (\\\d{ 3 }) 
                ! 
                  chr(oct($ 1 ))
                !
                 eg;
:)
...
Рейтинг: 0 / 0
20.03.2008, 12:56
    #35203201
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Garik888Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.Лучше всего спросить автора, или в ветке по Perl.
...
Рейтинг: 0 / 0
20.03.2008, 13:01
    #35203223
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
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
20.03.2008, 13:23
    #35203298
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Serik Akhmetovили в ветке по Perlперловики вряд ли знакомы с постгресовским типом bytea, и как его надо перекодировать :-(
...
Рейтинг: 0 / 0
20.03.2008, 13:43
    #35203379
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Garik888 Serik Akhmetov$data =~ s!\\\\(\d{3})!chr(oct($1)) !eg;Совсем не то, она оставила без изменения файл, т.е. со слешами и цифрами.так кажется должно работать. попробуйте вместе с binmode.
...
Рейтинг: 0 / 0
20.03.2008, 13:48
    #35203396
Garik888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
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
20.03.2008, 13:53
    #35203410
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl фунция
Garik888Даже не знаю что делать вроде все работает с этой строчкой
Код: plaintext
$data =~ s!\\(\d{ 3 })!chr(oct($ 1 )) !eg;
, но файл немного большего размера.Я тоже проверил, :)
regexp правильный.
Сделайте небольшой тестовый файл, и сравните, что появляется лишнее.

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

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

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

В клиенте у меня тип bytea определяется как blob, и я думаю с этим не может быть проблем т.к. первая функция которая тащит файл с сервера реализована у меня тоже через blob, и все работает как часы.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perl фунция / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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