【问题标题】:How to cancel a file upload based on file size in Catalyst如何在 Catalyst 中根据文件大小取消文件上传
【发布时间】:2013-06-18 23:02:50
【问题描述】:

我正在编写一个文件上传处理程序 Catalyst。我正在尝试限制最大文件大小。为此,我制作了一个插件(基于answer here)。这是我检查文件大小的代码:

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?
    }
};

这可以正确检测太大的文件,但我终生无法弄清楚如何中止上传。理想情况下,它也应该到达控制器/动作。谁能给我指点?非常感谢。

【问题讨论】:

    标签: perl catalyst


    【解决方案1】:

    很简单,您可能不应该这样做。您从插件代码中止处理所做的任何事情都会破坏用户代码以一种很好的方式处理这种情况的能力(例如,通过给出一个验证错误或一个很好的错误页面,而不是一个 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-&gt;stash-&gt;{request_body_aborted} 并做一些适当的事情——无论是设置表单验证错误,还是调用$c-&gt;error("Request too large"); $c-&gt;detach 或其他什么。它也是可配置的,任何插件都应该如此。

    【讨论】:

      【解决方案2】:

      我认为这需要在链条的早期发生。如果您有标头,则数据包已经创建。

      也许你可以试试:$c->detach();或者可能遍历 $c->stack 数组并删除可能已添加的与您的上传相关的操作。

      【讨论】:

      • 不,before 'prepare_body' 是 A) 足够早地停止读取请求正文,并且 B) 在调度程序运行之前很久,所以 $c-&gt;detach$c-&gt;stack 在这种情况下都没有意义。
      猜你喜欢
      • 2011-06-17
      • 2010-09-25
      • 2012-12-06
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多