The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Прочитать файл в переменную, зазиповать и выдать в браузер, !*! Афоня, 12-Дек-18, 09:32  [смотреть все]
Всем привет

Apache, на нём Perl-скрипт, который читает файл и выдаёт его в браузер:

open(my $F, '<', "/Folder/logs/error.log") or die $!;
binmode($F);
{
  local $/;
  my $Result = <$F>;
}
close($F);

print "Content-type: application/txt; charset=UTF-8\n";
print "Content-Disposition: attachment; filename="error.log\n\n";
print $Result;


Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.

1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?
2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь переменными?


Заранее спасибо!

  • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! ыы, 12:05 , 12-Дек-18 (1)
    >[оверквотинг удален]
    > open(my $F, '<', "/Folder/logs/error.log") or die $!;
    > binmode($F);
    > {
    >   local $/;
    >   my $Result = <$F>;
    > }
    > close($F);
    > print "Content-type: application/txt; charset=UTF-8\n";
    > print "Content-Disposition: attachment; filename="error.log\n\n";
    > print $Result;

    Бессмысленный скрипт. Веб сервер умеет отдавать статичный контент сам. для этого скрипт не нужен.

    > Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.

    Веб сервер как правило имеет соответствующую опцию по сжатию отдаваемого налету.
    сжатие веб сервером при этом и распаковка браузером  происходят прозрачно для пользователя...

    > 1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?

    организуйте конвеер через шелл-скрипт. примеров в инете как грязи.

    > 2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь
    > переменными?

    используйте в вышеупомянутом конвеере маску.

    > Заранее спасибо!

    • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! Афоня, 12:24 , 12-Дек-18 (3)
      Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание "прямой" (если так можно выразиться) ссылки невозможно для пользователя.

      Не понял, как сделать зип из нескольких файлов по конвееру? Там же в зипе имена как-то должны быть указаны

      • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! ACCA, 09:07 , 13-Дек-18 (6)
        > Не понял, как сделать зип из нескольких файлов по конвееру? Там же
        > в зипе имена как-то должны быть указаны

        Ага, указаны. В конце файла.
        ZIP - самый неудобный формат для [больших] потоков.

        Используй gzip, жми файлы по-одиночке. Если уж совсем неймётся - смотри на tar.gz.

        И будет тебе счастье.

      • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! Pahanivo, 22:42 , 13-Дек-18 (8)
        > Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание
        > "прямой" (если так можно выразиться) ссылки невозможно для пользователя.

        у вас там какое-то корпоративное табу на монтирование сетевых ресурсов?

      • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! ыы, 08:41 , 16-Дек-18 (10)
        > Статичный для примера, в реальности лог дёргается по сетевому пути и подсовывание
        > "прямой" (если так можно выразиться) ссылки невозможно для пользователя.

        Вам для начала надо ознакомится с матчастью. А "по наитию" вы так и  продолжите лепить горбатого.
        Статичный это не то что вы представляете. Статичный контент - это файл на диске или где-то еще, существующий постоянно, в отличие от динамического контента - генерируемого "на лету" скриптами.  Динамический контент нигде не существует постоянно, он генерируется, а статичный- существует постоянно, его можно в любой момент прочитать как файл. Тоесть елси до начала вызова скрипта, файл который вы собрались отдавать пользователю уже где-то существовал - то это статичный контент, а если он нигде не существовал- то динамический.
        Судя по вашему скрипту- вы тупо перекачиваете статичный контент, нагружая сервер совершенно бессмысленнйо работой ради работы. Ну или потому что архитектурное решение использованное вами- продиктовано незнанием и профневежеством.

        И так, ваши файлы - это все таки статичный контент, вне зависимости от того где в сети они находятся. на шаре удаленной, на каком-то сервере или гдето еще.
        И такие файлы веб- сервер умеет сжимать сам на лету при передаче. и отдавать сам без скриптов...

        > Не понял, как сделать зип из нескольких файлов по конвееру? Там же
        > в зипе имена как-то должны быть указаны

        Учите матчасть! Ну или.. чтение документации в слух - 300$ в час. "С выражением" - 700$ в час.
        При такой постановке вопроса вам не откажут в небольшом образовательном экскурсе в технологии  которые вы походу решили шапками закидать...

  • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! Pahanivo, 12:10 , 12-Дек-18 (2)
    >[оверквотинг удален]
    > }
    > close($F);
    > print "Content-type: application/txt; charset=UTF-8\n";
    > print "Content-Disposition: attachment; filename="error.log\n\n";
    > print $Result;
    > Иногда лог просто гигантский и его необходимо зазиповать перед выдачей.
    > 1. Как сделать это красиво "в воздухе", без пересохранения файла при зиповании?
    > 2. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь
    > переменными?
    > Заранее спасибо!

    1) Не использавать binmode для текстовых файлов.
    2) Читать файл readline  вместо my $Result = <$F>;
    3) почемубы вместо всего это идиотизма просто не отдавать файл целиком по ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он целиком отдается и прогонять его целиком через скрипт маразм.

  • Прочитать файл в переменную, зазиповать и выдать в браузер, !*! михалыч, 12:49 , 12-Дек-18 (4)
    http://yaforyou.ru/?q=perl%20create%20zip%20a...

    по первой же ссылке
    https://www.perlmonks.org/?node_id=929668

    use IO::Compress::Zip qw(:all);

    my @files = ('error.log', 'access.log', 'ssl_request.log');

    my $path = "/var/log/apache22";

    print "Content-Type:application/zip\n";
    print "Content-Disposition: attachment; filename=\"filename.zip\"\n\n";

    my $z;

    foreach my $file (@files) {
        if ($z) {
            $z->newStream(Name => $file, Method => ZIP_CM_STORE);
        } else {
            $z = new IO::Compress::Zip "-", Name => $file, Method => ZIP_CM_STORE;
        }

        open(FILE, "<", "$path/$file");
        binmode FILE;

        my ($buf, $data, $n);

        while (($n = read FILE,$data, 1024) != 0) {
            $z->print($data);
        }

        close(FILE);
    }

    $z->close;

    exit;

    всё уже изобретено до нас и для нас




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру