概述
我想将当前文件上传过程推送到队列。文件上传完成后,将向用户发送一封电子邮件,表明上传过程已完成。这个想法已经实现,因为将上传大量文件,我们希望用户在上传过程中导航到系统的其他部分。
现在有什么好处!
目前,我正在遍历所有要上传的文件(在我的控制器中)并创建上传文件的数组。我这样做是因为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));
在我的队列fire方法中,我获取了上传文件的数组。代码如下
$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类本身的构造函数中。
我还试图对类进行searlize和unserialize,但显然UploadFile不可序列化。
请有人帮忙!
由于
答案 0 :(得分:3)
不可能做你想做的事。
用户需要在表单的$ POST请求中完成文件上传 - 您无法排队'它将在以后完成。排队是为了延迟并稍后完成服务器端处理任务 - 但上传需要用户留在页面上以发送'数据到您的服务器。
要进一步扩展 - 您可以做的最佳选择是javascript asysncronous上传 - 使用像dropzonejs之类的软件包。这样,用户可以同时上传多个文件,并可以更新视觉进度条。
一种选择可能是上传'在新窗口中打开表单 - 这样用户就可以离开'当他们在另一个等待上传的窗口上浏览时,单独使用该窗口。
最后 - 此链接也可能有所帮助:How can I upload files asynchronously?