概述
我想将当前文件上传进程推送到队列中。文件上传完成后,将向用户发送一封电子邮件,告知上传过程已完成。这个想法已经实现,因为将上传大量文件,我们希望用户在执行上传过程时导航到系统的其他部分。
现在有什么!
目前我正在迭代所有要上传的文件(在我的控制器中)并创建上传文件的数组。我这样做是因为 Laravel 不允许我将模型发送到队列。这是代码
if (Input::hasFile('files')) {
$filesarr = Input::file('files');
foreach($filesarr as $fileitem)
{
array_push($filesArray, array(
'realpath'=>$fileitem->getRealPath(),
'originalname' => $fileitem->getClientOriginalName(),
'originalextension'=>$fileitem->getClientOriginalExtension(),
'mime' =>$fileitem->getClientMimeType(),
'size' =>$fileitem->getClientSize(),
'maxFileSizeAllowed' => $fileitem ->getMaxFileSize(),
'isUpdateMode' => 1,
'orealPath' => $fileitem->getOriginalPath()
));
}
}
然后我将此数组发送到队列。
Queue::push('TopicQueue', array ('dataArr' =>$filesArray));
在我的队列触发方法中,我正在获取上传文件的数组。代码如下
$files = $dataArray['$filesArray'];
现在,我尝试使用 Laravel 的文件上传方法,因此我再次尝试创建 Laravel 的 UploadFile 类的实例。其代码如下
foreach($allFiles as $file)
{
Log::info("File is :" .var_export($file,true));
Log::info('Going to upload file : '.$file['originalname']);
try
{
$uploadFile = new UploadedFile($file['realpath'],$file['originalname'],$file['mime'],$file['size']);
}
catch(Exception $ex)
{
Log::info('The error is : '.$ex->getMessage());
}
}
但是我在这里遇到了一个问题(这是正确的)。实例化失败并显示消息
该文件不存在。
这发生在 uploadfile 类本身的构造函数中。
我还尝试对类进行序列化和反序列化,但显然 UploadFile 不可序列化。
请有人帮忙!
谢谢
不可能做你想做的事。
用户需要在表单的 $POST 请求中完成文件上传 - 您不能将其“排队”以供稍后完成。排队是为了延迟服务器端处理任务并稍后完成 - 但上传需要用户停留在页面上以将数据“发送”到您的服务器。
为了进一步扩展 - 您可以做的最佳选择是 javascript 异步上传 - 使用像 dropzonejs 这样的包或其他东西。这样用户可以同时上传多个文件,并获得视觉进度条更新。
一种选择可能是在新窗口中打开“上传”表单 - 这样用户就可以在浏览另一个窗口等待上传时“离开”该窗口。
最后 - 此链接也可能有帮助:如何异步上传文件?