2014-10-06 64 views
0

我有一个控制器,有三个动作:indexiframeresult。它的工作方式是用户通过GET请求访问index操作。这呈现包含表单的视图。该表单只是一个按钮,可以POST到result。我的result操作只是呈现包含jQuery进度条和iframe的页面,其内容为iframe操作。 iframe操作会执行一些长时间运行的处理,并最终将结果返回到result视图。 (我需要在iframe中完成此操作的全部原因是result操作会随着进度条快速返回,因此用户不会认为该应用程序崩溃。)Rails:在控制器动作之间传递大量数据

以前,表单仅包含一个POST result。在这种情况下,iframe操作会从静态URL下载一个〜100MB文件并对其进行一些处理,然后使用处理结果更新父页面(result)。

现在我需要提供上传文件的过程,而不是始终使用静态URL进行下载。基本上,如果用户提供一个文件,使用该文件;否则,请使用静态URL。我修改了我的表单以接受文件上传,并且此部分工作正常。我的问题是如何将这个上传的文件从result传递到iframe〜100MB。这次会议太大了。上传的文件不需要在运行之间保存。

+0

你是在做处理服务器端还是客户端? – 2014-10-06 21:01:11

+0

服务器端。我想出了一个(临时的)解决方案,将上传的文件保存到一个新的文件中,然后通过'session [:something] =“/tmp/my_new_file.zip”将新创建的文件的位置传递给我的iframe。 – user1002119 2014-10-06 21:16:19

回答

0

除了实现细节之外,还应该更新一些问题的背景 - 上传的是哪种文件?你做什么样的处理?从最终用户的角度来看,该系统的目的是什么?它可以帮助人们了解你想要解决的问题。

我正在做一些假设有关系统的目的,在这里,但这里是我会怎么做:

我会上传文件,并将它们存储在文件系统中,并创建一个新的记录指示文件在系统内的位置的数据库表,以及文件是否被“处理”。您可以使用载波宝石为:https://github.com/carrierwaveuploader/carrierwave

然后,我会使用某种背景作业工具来做实际处理。因此,上传文件时,将其添加到“待处理内容队列”中,然后向用户返回一条消息,说明“该作业已添加到队列中进行处理,并且即将完成”。您在数据库表中保存的行的ID可以用作需要处理文件的标识符。处理完成后,将数据库中的“已处理”列更新为true。有几种宝石从当它涉及到后台作业的选择 - 一个流行的是SideKiq - http://sidekiq.org/

在这一点上,它基本上取决于你在如何顺利,你想从你的最终用户的角度进行处理条款。最简单的情况是:

当您返回消息“作业已添加到队列中进行处理并很快完成”时,您还可以说“应在几分钟内完成”刷新此页面看看你的工作是否完成“。每次刷新,如果处理完成,你会让他们知道。

更复杂的方式是:一旦“作业已添加到队列”页面显示,您可以显示一个计时器记录多长时间,并使用JavaScript定时器定期向服务器发送AJAX请求每隔几秒钟检查一次工作是否完成。作业完成后,使用AJAX更新页面以指示该作业。