The OpenNET Project / Index page

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



"Прочитать файл в переменную, зазиповать и выдать в браузер"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от Афоня (?), 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. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь переменными?


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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от ыы (?), 12-Дек-18, 12:05 
>[оверквотинг удален]
> 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. Как зазиповать несколько файлов, тем же способом, т.е. манипулируя только лишь
> переменными?

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от Pahanivo (ok), 12-Дек-18, 12:10 
>[оверквотинг удален]
> }
> 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) почемубы вместо всего это идиотизма просто не отдавать файл целиком по ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он целиком отдается и прогонять его целиком через скрипт маразм.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от михалыч (ok), 12-Дек-18, 12:49 
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;

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от Афоня (?), 12-Дек-18, 16:54 
Спасибо!
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от ACCA (ok), 13-Дек-18, 09:09 
> 3) почемубы вместо всего это идиотизма просто не отдавать файл целиком по
> ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он
> целиком отдается и прогонять его целиком через скрипт маразм.

А ещё включить gzip на лету в том же апаче. Вообще ничего писать не нужно.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

9. "Прочитать файл в переменную, зазиповать и выдать в браузер"  +/
Сообщение от Pahanivo (ok), 13-Дек-18, 22:43 
> А ещё включить gzip на лету в том же апаче. Вообще ничего
> писать не нужно.

Афтар на своей волне походу - через опу но по своему.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

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

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Ihor
Хостинг:

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