尝试将文件上传进程推送到队列时遇到问题

问题描述 投票:0回答:1

概述

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

现在有什么!

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

请有人帮忙!

谢谢

php laravel file-upload laravel-4 queue
1个回答
4
投票

不可能做你想做的事。

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

为了进一步扩展 - 您可以做的最佳选择是 javascript 异步上传 - 使用像 dropzonejs 这样的包或其他东西。这样用户可以同时上传多个文件,并获得视觉进度条更新。

一种选择可能是在新窗口中打开“上传”表单 - 这样用户就可以在浏览另一个窗口等待上传时“离开”该窗口。

最后 - 此链接也可能有帮助:如何异步上传文件?

© www.soinside.com 2019 - 2024. All rights reserved.