2009-07-03 55 views
0

我需要为用户提供一个可下载的HTML版本的统计页面。我走到这一步,为创建一个控制器动作,将设置标题如下然后渲染并返回我的香草HTML页面:rails:模拟“保存页面为”行为

headers["Content-Type"] ||= 'application/x-unknown' 
headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 

这将使浏览器弹出打开下载对话框,而不是渲染HTML马上,这是期望的。但是,这只给了我空白的HTML没有任何图像或CSS嵌入。

我想要做的事情基本上与浏览器在单击“Save Page as”菜单项时所做的一样(可能甚至将zip图像,css和html文件放在zip文件中并返回)。

什么是正确的方法来做到这一点?有没有办法使用标题设置调用浏览器的“Save page as”对话框?

问候,

塞巴斯蒂安

回答

1

这是可能的工作程序......

  1. 组装要下载的东西 - 渲染HTML,图像,CSS等 - 到文件系统上的一个临时目录。

    • 为dir指定一个绝对唯一的名称(也许使用timestamp)。
    • 您可以将呈现的HTML文件放在目录根目录中,并将资源置于assets子目录中。
    • 您需要修改HTML文件中的所有资产项URI以指向assets dir中的项目,而不是其通常的位置。例如:

      <img src='assets/my_img.jpg'>

  2. 邮编它分为使用rubyzip宝石一个* .zip存档。

  3. 使用Rails的send_file方法打开下载对话框。

    send_file '/path/to.zip'

  4. 删除临时目录和zip压缩文件。避免在用户下载时删除它。也许建立一个cron工作来每天清理一次。

+0

不同这正是我结束了在此期间:-)谢谢做无论如何! – Sebastian 2009-07-05 08:57:36

0

你可以尝试设置的HTTP内容类型为“application /八位字节流”,让我知道是否有帮助?

+0

不,这并不做任何事情比“应用程序/ x-未知” – Sebastian 2009-07-03 19:56:41

0

为我工作:

send_data(render, :filename => "filename.ext")