- Прочитать файл в переменную, зазиповать и выдать в браузер, ыы, 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) почемубы вместо всего это идиотизма просто не отдавать файл целиком по ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он целиком отдается и прогонять его целиком через скрипт маразм.
- Прочитать файл в переменную, зазиповать и выдать в браузер, ACCA, 09:09 , 13-Дек-18 (7)
> 3) почемубы вместо всего это идиотизма просто не отдавать файл целиком по > ссылке, вывалив каталог логов в апаче с включенным индексированием, ибо он > целиком отдается и прогонять его целиком через скрипт маразм.А ещё включить gzip на лету в том же апаче. Вообще ничего писать не нужно.
- Прочитать файл в переменную, зазиповать и выдать в браузер, михалыч, 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;
всё уже изобретено до нас и для нас
|