2010-06-17 5 views
0

Windows 서버에서 perl 5.8.8을 사용합니다. Archive :: Zip을 사용하여 perl cgi 스크립트를 작성하여 사용자가 다운로드해야하는 zip 파일을 생성합니다 : 그쪽에 문제 없습니다. zip은 메모리에서 관리되며 실제 파일은 임시 파일을 사용하여 디스크에 기록되지 않습니다. 스트림을 브라우저에 쓰는 zip 다운로드를 허용하는 방법을 궁금합니다. 내가 무슨 짓을하는 것은 같은 것입니다 :펄 : cgi-bin 스크립트에서 stdin 핸들을 얻으려면

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 
관련 문제