【问题标题】:Ruby: Display HTML file in Memory Without Saving it to DiskRuby:在内存中显示 HTML 文件而不将其保存到磁盘
【发布时间】:2011-10-28 18:41:32
【问题描述】:

我在内存中有一个 html 报告,想将其显示给用户,而不会将报告保存到磁盘。我暂时不用担心 windows,所以我一直在用 ruby​​ 制作 tmp 文件并使用系统 open 来显示文件。

report_file = Tempfile.new([report.name, report.extension])
report_file.write(report.text)
system "open #{report_file.path}"

虽然这看起来可行,但它不起作用,因为在 safari/chrome 可以实际读取数据之前从内存中清除了临时文件(系统在命令 open 返回时返回,它不考虑safari/chrome/etc. 实际读取数据所需的时间。)为了解决这个问题,我在open 之后一直在使用sleep 60。

我的问题是:有没有比使用 tmpfiles 更好的方法来向用户显示 html 文件而不保存它?如果没有,是否有办法等待 safari/chrome/etc。在不使用sleep 调用的情况下读取文件?

【问题讨论】:

  • 为什么要避免使用临时文件?我能想到的唯一选择是制作一个 GUI 应用程序并嵌入一个 HTML 呈现组件,这只是为了显示报告而做的很多工作。
  • 不避免临时文件,他们只是有限制,要求其他解决方案,或者解决临时文件限制的解决方案。编写 GUI 会过度构建解决方案。
  • 哦,Ruby的临时文件不能设置为不自动删除?奇怪的。您可以尝试使用system 'mktemp -t someprefix' 获取临时文件名,或者寻找mkstemp 的接口。

标签: ruby macos file-io


【解决方案1】:

我不知道你是否没有达到某些命令行长度限制之类的,但是有http://en.wikipedia.org/wiki/Data:_URI_scheme

这样的东西即使在 Windows 上也可以使用:

firefox.exe "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="

所以试试这个:

require "base64"
report_text = Base64.encode64(report.text)
system "firefox 'data:text/html;base64,#{report_text}'"

【讨论】:

  • firefox: command not found 如果我尝试system "open /Applications/Firefox.app 'data:text/html;base64,#{report_text}'" 然后它告诉我文件:'data:text/html;base64,#{report_text}' 不存在。
  • 我用的不是Mac,就是Linux,应该是一样的。这适用于 irb:system "/usr/bin/firefox 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='",因此请尝试使用 /Applications/Firefox.app 而不是 /usr/bin/firefox
猜你喜欢
  • 2015-05-10
  • 2021-05-03
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多