2

在我基于 Rails 的网站上,我希望用户能够输入一个 URL,我的服务器使用wget 带有 recursive 选项的 Unix 命令下载该 URL 。然后,我的服务器会压缩这些下载的文件以及服务器上已有的一些文件,并使用 Rails 命令将压缩文件发送给用户send_file

现在,我担心send_file会在wget压缩完成之前执行。如何确保仅在下载和压缩完成后发送文件?这种方法行得通,还是我应该采取另一种方法?

4

2 回答 2

2

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

def some_action
  # some magic
  out = `wget ....`
  # zip
  send_file #...
end
于 2012-11-01T21:36:01.747 回答
2

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

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

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

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

卸载允许您将请求排队,这样您就可以有效地管理同时下载和处理任务的数量。如果下载是由用户操作直接启动的,那么如果几个/许多人同时开始请求所有文件,您最好希望您的应用服务器能够处理负载。向您的操作系统发起工作会导致内存/资源使用量猛增,因为您必须为每个进程将单独的 shell 加载到内存中。

于 2012-11-01T21:48:07.567 回答