如何让 Mojolicious::Plugin::Minion 作业处理大文件上传
How to make a Mojolicious::Plugin::Minion job handle a large file upload
我正在尝试处理大文件上传
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
});
}
看起来小黄人没有得到对象。我收到以下错误
Can't locate object method "filename" via package "Mojo::Upload=HASH(0x34451d0)" (perhaps you forgot to load "Mojo::Upload=HASH(0x34451d
鉴于 minion 作业 运行 作为子进程,这种 IPC 甚至可能吗?
请帮助我理解。我认为,在文件上传之前,服务器和客户端都在忙于传输文件数据,即使 minion 可以处理,服务器也无法发回响应。
您不能在 enqueue
调用中将对象(或任何形式的引用)作为参数传递,因为它们在 minion
的上下文中毫无意义
此声明
my $id = $c->minion->enqueue( upload_file => [ $c->param('filepath') ] );
正在传递 Mojo::Upload
对象的 序列化版本 ,即 字符串
"Mojo::Upload=HASH(0x34451d0)"
,所以调用filename
方法是没有意义的
话虽如此,恐怕我无法提供一种方法来完成这项工作。来自文件的数据作为 HTTP 请求的一部分发送,在服务器完成接收之前发送对该请求的响应是没有意义的。使服务器异步并不意味着您的客户端可以做同样的事情
从客户端的角度来看没有太多意义:它仍然必须是 运行 代码才能将文件的内容传输到服务器。除非您想在正常的 HTTP 对话之外进行传输,否则您不能在传输继续的同时继续进行交互式会话
我正在尝试处理大文件上传
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
});
}
看起来小黄人没有得到对象。我收到以下错误
Can't locate object method "filename" via package "Mojo::Upload=HASH(0x34451d0)" (perhaps you forgot to load "Mojo::Upload=HASH(0x34451d
鉴于 minion 作业 运行 作为子进程,这种 IPC 甚至可能吗?
请帮助我理解。我认为,在文件上传之前,服务器和客户端都在忙于传输文件数据,即使 minion 可以处理,服务器也无法发回响应。
您不能在 enqueue
调用中将对象(或任何形式的引用)作为参数传递,因为它们在 minion
此声明
my $id = $c->minion->enqueue( upload_file => [ $c->param('filepath') ] );
正在传递 Mojo::Upload
对象的 序列化版本 ,即 字符串
"Mojo::Upload=HASH(0x34451d0)"
,所以调用filename
方法是没有意义的
话虽如此,恐怕我无法提供一种方法来完成这项工作。来自文件的数据作为 HTTP 请求的一部分发送,在服务器完成接收之前发送对该请求的响应是没有意义的。使服务器异步并不意味着您的客户端可以做同样的事情
从客户端的角度来看没有太多意义:它仍然必须是 运行 代码才能将文件的内容传输到服务器。除非您想在正常的 HTTP 对话之外进行传输,否则您不能在传输继续的同时继续进行交互式会话