2011-11-22 2 views
2

이 Perl/CGI를 사용하여 파일을 업로드하고 업로드하는 동안 업로드 된 파일 크기를 얻습니다.대용량 업로드시 Perl/CGI 스크립트가 실패합니다

스크립트는 500MB 미만의 파일에서는 제대로 작동하지만 버퍼 (OUTFILE)는 약 500MB 이후에 파일 쓰기를 중지합니다. 다음 부분 코드입니다 : 스크립트가 문제가 아닌 경우

$u_size = $ENV{'CONTENT_LENGTH'}; 
if ($u_size > $max_size) {send_error ("Upload too big. Maximum size is $max_size bytes and your file is $u_size bytes.");} 

print_progress(0); 
# Set up uploading function 
$query = CGI->new(\&hook); 

#define functions 
sub hook { 
    if ($error) {return;} 
    if (time >= $next_print) { 
     $next_print = time + $delay; 
     my ($filename, $buffer, $bytes_read, $data) = @_; 
     if ($check_mime) { 
      $filename =~ m/\.([^\.]+)$/; 
      $ext = lc($1); 
      print $ext; 
      $check_mime = 0; 
     } 
     $percent = $bytes_read/$u_size; 
     $filename =~ m/\\([^\\]+)$/; 
     $filename = $1; 
     print_progress($percent, $u_size, $bytes_read, $filename); 
    } 
} 

sub print_progress { 
    open(PROG, '>'.$uploaded_file_progress); 
    print PROG '{"percent" : ' . ($_[0] * 100) . ', "total" : ' . $_[1] . ', "uploaded" : ' . $_[2] . ', "filename" : "' . $_[3] . '"}'; 
    close PROG; 
} 

############# 

$uphandle = $query->upload($query->param()); 
binmode $uphandle; 

if (!$error) { 
    open OUTFILE, ">" . $uploaded_file; 
    binmode OUTFILE; 
    while($bytesread = read $uphandle, $buffer, 1024) { 
     print OUTFILE $buffer; 
    } 
    #while (<$uphandle>) {print OUTFILE $_;} 
    close OUTFILE; 
} 

, 어떤 다른 물건을 내가 확인해야하는? 감사합니다. .

편집 : 로그에 다음과 같은 내용이 있습니다. CGI 스크립트의 출력을 기다리는 시간 초과입니다. 어떻게 제거하나요? Google에서 확실한 답을 찾을 수 없었습니다.

답변

2

당신이 아파치 conf에서 구성 변수 TimeOut 아파치를 찌를 필요가 있다고 생각합니다.

perl을 사용함을 알기 때문에 perlmonks.org에서 몇 번이나 부러졌으며이 링크가 응답으로 나타났습니다. 은`TimeOut`의 설정에 방향

http://www.stonehenge.com/merlyn/LinuxMag/col39.html

+0

감사합니다. 이것이 두 서버에서 유일한 것입니다. 나는 그게 그렇게 간단하지 않다고 믿을 수 없다. – user173457

1

$ CGI :: POSTMAX를 500MB보다 큰 값으로 설정하여 문제가 해결되는지 확인할 수 있습니다.

내가 잘못하지 않은 경우 POSTMAX의 기본값은 500MB입니다. 나는 항상 2GB로 광산을 설치했다. (하지만 비디오를 많이 업로드하는 데 사용한다.)

0

아파치를 사용하고 있다면 조사 할 가치가있는 아파치 httpd.conf 'MaxRequestLen'설정이있다.

관련 문제