Как отменить загрузку файла в зависимости от размера файла в Catalyst - PullRequest
2 голосов
/ 22 июня 2010

Я пишу обработчик загрузки файлов 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?
    }
};

Это правильно определяет слишком большие файлы, но я не могу понять, как прервать загрузку В идеале, оно также должно достигать контроллера / действия. Кто-нибудь может дать мне указатель? Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Очень просто, вы, вероятно, не должны.Все, что вы делаете из кода плагина для прерывания обработки, выбивает способность пользовательского кода хорошо справляться с ситуацией (например, путем выдачи ошибки проверки или приятной страницы ошибки вместо страницы исключения 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 или что-то еще.Он также настраивается, как и любой плагин.

0 голосов
/ 30 июня 2010

Я думаю, что это должно произойти раньше в цепочке. Если у вас есть заголовки, пакет уже создан.

Возможно, вы могли бы попробовать: $ c-> detach (); или, возможно, перебрать массив $ c-> stack и удалить действия, которые могли быть добавлены, связанные с вашей загрузкой.

...