在尝试将文件上载过程推送到队列时遇到问题

时间:2014-05-15 05:25:11

标签: file-upload laravel laravel-4 queue

概述

我想将当前文件上传过程推送到队列。文件上传完成后,将向用户发送一封电子邮件,表明上传过程已完成。这个想法已经实现,因为将上传大量文件,我们希望用户在上传过程中导航到系统的其他部分。

现在有什么好处!

目前,我正在遍历所有要上传的文件(在我的控制器中)并创建上传文件的数组。我这样做是因为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不可序列化。

请有人帮忙!

由于

1 个答案:

答案 0 :(得分:3)

不可能做你想做的事。

用户需要在表单的$ POST请求中完成文件上传 - 您无法排队'它将在以后完成。排队是为了延迟并稍后完成服务器端处理任务 - 但上传需要用户留在页面上以发送'数据到您的服务器。

要进一步扩展 - 您可以做的最佳选择是javascript asysncronous上传 - 使用像dropzonejs之类的软件包。这样,用户可以同时上传多个文件,并可以更新视觉进度条。

一种选择可能是上传'在新窗口中打开表单 - 这样用户就可以离开'当他们在另一个等待上传的窗口上浏览时,单独使用该窗口。

最后 - 此链接也可能有所帮助:How can I upload files asynchronously?