【问题标题】:How to make a Mojolicious::Plugin::Minion job handle a large file upload如何让 Mojolicious::Plugin::Minion 作业处理大文件上传
【发布时间】:2018-01-19 15:31:24
【问题描述】:

我正在尝试处理大文件上传 Mojolicious::Plugin::Minion 以便我可以快速响应用户或 REST API 调用者。

    # app start up   
     sub startup {
        ...
        $self->minion->add_task(upload_file => sub {
                                        my ($job, $file) = @_;
                                        my $filename = $file->filename;
        });
        ...
      }

    # Controller:
      sub upload_file {
            my $c = shift;
            $c->openapi->valid_input or return;

            # curl  -k -F name=test -F filepath=@/tmp/test.txt http://endpoint-to-uplod_file
            my $id = $c->minion->enqueue(upload_file => [$c->param('filepath')]);

            return $c->render(openapi => {
                message => q|request to upload file has been received Successfully.
                       This File will be zipped, encrypted and finally transferred to cloud.|,      
                statuscheck_endpoint => "uploadStatus/$id",
                jobid => $id
            });
       }

看起来奴才没有得到对象。我收到以下错误

无法通过包“Mojo::Upload=HASH(0x34451d0)”定位对象方法“filename”(可能您忘记加载“Mojo::Upload=HASH(0x34451d)”

鉴于 minion 作业作为子进程运行,这种 IPC 甚至可能吗?

请帮助我理解。我认为,在文件上传之前,服务器和客户端都在忙于传输文件数据,即使 minion 可以处理,服务器也无法发回响应。

【问题讨论】:

  • 小文件上传有用吗?
  • 没有。它不起作用。

标签: perl mojolicious


【解决方案1】:

您不能在enqueue 调用中将对象(或任何形式的引用)作为参数传递,因为它们在 minion 的上下文中毫无意义

此声明

my $id = $c->minion->enqueue( upload_file => [ $c->param('filepath') ] );

正在传递Mojo::Upload 对象的序列化版本,它是字符串 "Mojo::Upload=HASH(0x34451d0)",所以在它上面调用filename方法是没有意义的

话虽如此,恐怕我无法提供一种方法来完成这项工作。文件中的数据作为 HTTP 请求的一部分发送,在服务器完成接收之前发送对该请求的响应是没有意义的。使服务器异步并不意味着您的客户端可以做同样的事情

从客户端的角度来看,这没有什么意义:它仍然必须运行代码才能将文件的内容传输到服务器。除非您想在正常 HTTP 对话之外进行传输,否则您不能在传输继续时继续进行交互式会话

【讨论】:

  • 谢谢。是的,这也是我的理解。我想验证我的理解。你让我明白了。
猜你喜欢
  • 2018-08-26
  • 2021-07-07
  • 1970-01-01
  • 2021-01-24
  • 2014-09-12
  • 2017-02-18
  • 2012-04-26
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多