2010-06-22 4 views
2

저는 파일 업로드 처리기 Catalyst를 작성하고 있습니다. 최대 파일 크기를 제한하려고합니다. 이렇게하려면 플러그인을 만들었습니다 (answer here 기준). 저는 여기에 파일 크기를 확인하는 코드입니다 :Catalyst에서 파일 크기를 기반으로 파일 업로드를 취소하는 방법

before 'prepare_body' => sub { 
    my $c = shift; 

    my $req = $c->request; 
    my $length = $req->headers->{"content-length"}; 
    if ($length > 10000) 
    { 
     $c->stash->{errors} = "File upload error"; 
     # how do I abort the upload? 
    } 
}; 

이 올바르게 너무 큰 파일을 감지하지만 난 내 인생에 업로드를 중단하는 방법을 알아낼 수 없기 때문. 이상적으로 컨트롤러/액션에도 도달해야합니다. 누구든지 내게 포인터를 줄 수 있습니까? 고마워.

답변

0

이 문제는 체인의 초기에 발생해야한다고 생각합니다. 헤더가 있으면 패킷이 이미 생성되어 있습니다.

아마도 시도해 볼 수 있습니다. $ c-> detach(); 또는 아마도 $ c-> 스택 배열을 반복하고 업로드와 관련하여 추가되었을 수있는 작업을 제거하십시오.

+0

아니요, 'prepare_body'이전에 A) 요청 본문을 읽는 것을 멈추기에 충분히 일찍 B) 발송자가 실행되기 오래 전에 '$ c-> detach'와 '$ c-> stack' 모두 이 문맥에서는 의미가 없다. – hobbs

2

매우 간단히 말해서는 안됩니다. 처리를 중단하기 위해 플러그인 코드에서 수행하는 작업은 좋은 방법으로 상황을 처리 할 수있는 사용자 코드 기능을 사용하지 않을 것입니다 (예 : 유효성 검증 오류 또는 Catalyst 예외 페이지 대신 좋은 오류 페이지 제공) .

그러나 모두 손실되지 않습니다. 왜 이렇게 해보지 않으시겠습니까?

around 'prepare_body' => sub { 
    my ($orig, $self) = (shift, shift); 
    my ($c) = @_; 

    my $max_length = $c->config->{'Plugin::WhateverMyNameIs'}->{max_request_size}; 
    $max_length = 1_000_000 unless defined $max_length; # default 
    my $length = $c->engine->read_length; 
    if ($length <= $max_length) { # ok, go ahead 
    $self->$orig(@_); 
    } else { 
    $c->stash->{request_body_aborted} = 1; 
    } 
}; 

요청이 이상 크기의 경우이 읽기를 중지하지만, 파견이 정상적으로 진행하게됩니다 - 당신은 당신의 행동에 약간의 코드를 작성하려는, 또는 begin 행동을 의미하는, 또는 체인 루트에서 $c->stash->{request_body_aborted}을 확인하고 양식 유효성 검사 오류를 설정했는지 또는 $c->error("Request too large"); $c->detach 또는 기타를 호출하는지에 관계없이 적절한 작업을 수행합니다. 모든 플러그인이 있어야하므로 구성 할 수도 있습니다.

관련 문제