Perl получение страницы

Тема в разделе "Perl, Python, Ruby", создана пользователем LEXAlForpostl, 1 фев 2013.

  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Здравствуйте.
    Необходимо, чтобы perl скрипт подгружал данные с сайта и отображал их.
    В .htaccess укажу, что /images/* /cgi/script.pl?$1
    И теперь надо, чтобы скрипт обратился к файлу Перейти по ссылке , где $1 - это название файла и расширение, которое указал юзер, скачал и отобразил его.
    С перлом никогда не работал, но на новом сервере админ сказал, что надо сделать именно так.
    Буду безмерно благодарен за помощь.
     
    Iwashka нравится это.
  2. TLemur

    TLemur Писатель

    Регистр.:
    21 янв 2013
    Сообщения:
    9
    Симпатии:
    7
    Закачка:

    Код:
    my $data = LWP::Simple::get $params{URL};
    my $filename = "image.jpg";
    open (FH, ">$filename");
    binmode (FH);
    print FH $data;
    close (FH);
    Отображение:

    Код:
    my $file = "image.jpg";
    my $length = (stat($file)) [10];
    print "Content-type: image/jpg\n";
    print "Content-length: $length \n\n";
    binmode STDOUT;
    open (FH,'<', $file) || die "Could not open $file: $!";
    my $buffer = "";
    while (read(FH, $buffer, 10240)) {
        print $buffer;
    }
    close(FH);
     
    Iwashka нравится это.
  3. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Не всегда это будут картинки JPG, иногда html страницы.
    Вот товарищ написал код, но хостинг говорит, что ошибки в коде:
    Код:
    #use strict;
    #use warnings;
    my $query = $ENV{'REQUEST_URI'};
    $query //= $ARGV[0];
    $query //= '/';
    My $response = `wget --ignore-length --save-headers --no-check-certificate -qO — http://mail.ru$query`;
    binmode STDOUT, ":utf8";
    print $response;
     
    Iwashka нравится это.
  4. TLemur

    TLemur Писатель

    Регистр.:
    21 янв 2013
    Сообщения:
    9
    Симпатии:
    7
    Ну тогда как-то так:

    Код:
    use strict;use warnings;use LWP::Simple;
    my $query = $ENV{'REQUEST_URI'}; $query //= $ARGV[0]; $query //= '/';
    my $url ='http://mail.ru$query';my $file ='filename_here'; getstore($url, $file);
    my $length = (stat($file)) [10];
    binmode STDOUT;
    open (FH,'<', $file) || die "Could not open $file: $!";
    my $buffer = "";
    while (read(FH, $buffer, 10240)) {
        print $buffer;
    }
    close(FH);
    Использовать системные вызовы не рекомендуется, тем более, что в Perl есть дофига своих механизмов.
     
    Iwashka нравится это.
  5. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
     
    Iwashka нравится это.
  6. TLemur

    TLemur Писатель

    Регистр.:
    21 янв 2013
    Сообщения:
    9
    Симпатии:
    7
    Тогда замените вторую строку на
    @values = split(/&/,$ENV{'QUERY_STRING'});
    Выйдет ассоциированный массив, с которым, я думаю, понятно как работать.
     
    Iwashka нравится это.
  7. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Честно сказать, не понял, что именно надо сменить в скрипте. Строку заменил, всё равно ругается хостинг на данный скрипт.

    Через командную строку скрипт, который указал в 3м сообщении работает. Однако через веб - ругается хостинг.
    Вот редирект в .htaccess'e
    Код:
    RewriteRule ^images/(.*)$ /cgi-bin/img_02.pl?$1 [L,PT]
     
    Последнее редактирование модератором: 17 дек 2013
    Iwashka нравится это.
  8. TLemur

    TLemur Писатель

    Регистр.:
    21 янв 2013
    Сообщения:
    9
    Симпатии:
    7
    Добавьте переменную в вызов.
    Например, RewriteRule ^images/(.*)$ /cgi-bin/img_02.pl?s=$1 [L,PT]
    Потом работать с ней так:
    Код:
    @values = split(/&/,$ENV{'QUERY_STRING'});
    my query=@values['s']
     
    Iwashka нравится это.
  9. Василий Иванченко

    Василий Иванченко Создатель

    Регистр.:
    7 сен 2013
    Сообщения:
    12
    Симпатии:
    1
    Используй LWP::UserAgent
     
    Iwashka нравится это.
  10. chempion

    chempion Создатель

    Регистр.:
    22 ноя 2012
    Сообщения:
    10
    Симпатии:
    2
    Код:
    use strict;use warnings;use LWP::Simple;
    my $query = $ENV{'REQUEST_URI'}; $query //= $ARGV[0]; $query //= '/';
    my $url ='http://mail.ru$query';my $file ='filename_here'; getstore($url, $file);
    my $length = (stat($file)) [10];
    binmode STDOUT;
    open (FH,'<', $file) || die "Could not open $file: $!";
    my $buffer = "";
    while (read(FH, $buffer, 10240)) {
        print $buffer;
    }
    close(FH);
     
    Iwashka нравится это.