通过Rails控制器发送下载的文件

时间:2012-11-01 21:29:36

标签: ruby-on-rails ruby-on-rails-3

在我的基于Rails的网站上,我希望用户能够输入一个URL,我的服务器使用Unix命令wget 使用递归选项下载该URL。然后我的服务器将这些下载的文件与服务器上已有的一些文件一起拉开,并使用Rails命令send_file将zip发送给用户。

现在,我担心send_file将在wget之前执行并且压缩完成他们的工作。如何确保仅在下载和压缩完成后才发送文件?这种方法会起作用,还是应该采取另一种方法?

2 个答案:

答案 0 :(得分:2)

您是如何在应用程序中与wget进行交互的?如果你正在使用ruby的反引号或类似的,它应该等到命令退出

def some_action
  # some magic
  out = `wget ....`
  # zip
  send_file #...
end

答案 1 :(得分:2)

最好将下载任务卸载到工作线程(或服务),并在下载准备就绪时通知用户。

如果你想非常优雅,你可以在你的布局中使用一些javascript(/ view / partial / etc)定期检查完成情况,然后通知用户/提供下载选项。< / p>

您要卸载的原因是以下任何一种情况都会导致您的进程失败:

  • 浏览器超时
  • 用户执行破坏性操作,例如刷新,返回等。
  • 来自服务器wget的响应缓慢/失败(如果客户端正在等待,您如何重试失败?)
  • 其他错误情况(磁盘已满?重复文件名?拉链错误?)

卸载允许您对请求进行排队,以便您可以有效地管理同时下载和处理任务的数量。如果通过用户操作直接启动下载,您最好希望您的应用服务器可以处理负载,如果有多个/多人开始一次请求文件。向你的操作系统进行操作会导致内存/资源使用量猛增,因为你必须为每个进程加载一个单独的shell

相关问题