2010-06-17 2 views
0

Использование perl 5.8.8 на сервере Windows Я пишу скрипт perl cgi с помощью Archive :: Zip для создания на лету zip, который должен быть загружен пользователями : никаких проблем с этой стороны. Zip управляется в памяти, физический файл не записывается на диск с использованием временных файлов или что-то еще. Мне интересно, как разрешить загрузку zip, записывая поток в браузер. То, что я сделал что-то вроде:Perl: получение дескриптора для stdin для использования в скрипте cgi-bin

binmode (STDOUT); 
$zip->writeToFileHandle(*STDOUT, 0); 

, но я чувствую неуверенность в этом случае, чтобы получить STDOUT в качестве дескриптора файла. Является ли это правильным и надежным? Существует лучший способ?

Большое спасибо за ваши советы

ответ

5

Что вы делаете выглядит прекрасно!

+0

Может кто-нибудь изменить это, чтобы оставить комментарий, объясняющий, что не так с кодом вопрошающего? – psmears

+0

Я очень сожалею об этом ... я нажал неправильную кнопку * по ошибке * при утверждении вашего ответа. В фактах нет смысла принимать ответ, который вам не нравится. Когда я узнал об ошибке, я нажал кнопку вверх, и я получил сообщение о том, что кнопка заблокирована, поэтому я не могу изменить статус вверх/вниз. дайте мне знать, как я могу помочь. Извините еще раз – Daniel

+0

А в этом случае нет проблем, спасибо за объяснение :-) Иногда меня раздражает на этом сайте, когда я вижу, что люди отрицают голоса, не тратя время на объяснение * почему * они думают, что что-то плохое. Но с кем-то может произойти неправильный щелчок ;-) – psmears

3

Это хороший шанс продемонстрировать virtue of Impatience.

Программисты любят отбрасывать повторение постоянных литералов и помещать их в контейнеры постоянного типа. (Но я буду просто использовать переменную здесь, чтобы не отвлекать от важной части.)

use IO::File qw(); 
my $handle = bless(\*STDOUT => 'IO::File') 
    or die $OS_ERROR; 
# Why not just `$handle = STDOUT`? Code above is necessary 
# because using bare STDOUT invokes on IO::Handle only 
# which does not have the binmode method. 
⋮ 
$handle->binmode(1); 
$handle->print('something'); 

Это не похоже на победу, потому что гораздо больше кода, чем раньше. Большой выигрыш приходит, как только вы решаете, что вы больше не хотите печатать до STDOUT, но в реальном файле. Или, возможно, вы хотите получить результат. Тогда вам нужно изменить только одну строку кода вместо нескольких.

my $handle = IO::File->new('/var/log/cgi', 'a') 
    or die $OS_ERROR; 
# method calls on $handle stay the same as before