【问题标题】:send_file in rails does not download to browser - instead loads in browser window directly [duplicate]rails中的send_file不会下载到浏览器-而是直接在浏览器窗口中加载[重复]
【发布时间】:2023-03-08 21:40:01
【问题描述】:

我的 .erb 中有以下内容:

<%= link_to 'Download PDF', planners_download_pdf_url %>

我有以下方法回复:

  def download_pdf
  send_file(
     "#{Rails.root}/Thing/ex/example.xls",
filename: "mything.xls",
type: "application/xls"
  )
  end

我的路线有:

get '/planners/download_pdf'

当我点击我的链接时,该方法会被调用。我的问题是没有下载到浏览器。相反,它使用我在浏览器中打开的选项卡并将文件转储为 HTML。比如……你见过用记事本打开的 Excel 文件吗?它这样做。见下文:

我如何获得这个来代替下载文件?

【问题讨论】:

标签: ruby-on-rails ruby erb


【解决方案1】:

您需要将disposition: 'attachment' 添加到您的send_file 选项哈希中(或者至少确保您没有设置disposition: 'inline',因为'attachment' 应该是默认值)。

如果这不是问题,如果您使用的是 Turbolinks,如other answers 中所述,您需要通过在链接元素中设置data-turbolinks="false" 来设置disable Turbolinks on the link(例如:data: {turbolinks: false} 在您的link_to 标签助手中)。

最后,如果这不起作用,可以尝试以下其他方法:

  • type 设置为 'application/vnd.ms-excel',这是 XLS 文件的有效 MIME 类型。
  • 直接在链接标签上设置download="mything.xls" html5 attribute(例如:download: 'mything.xls' 在您的link_to 标签助手中。

【讨论】:

  • 我实际上把方法改成了:send_file("#{Rails.root}/Planners/viacom/Viacom_TVE_March_2017_PAIDs_03102017.xls", filename: "mything.xls", type: "application/xls", disposition: 'attachment' ) 仍然得到这种行为。
  • 如果您使用的是 Turbolinks,这可能是问题的原因,您可以尝试在链接标签中禁用它。
  • 在这种情况下我没有使用 turbolinks。这只是一个香草erb link_to。不过,我会检查重复的问题。
  • 有趣的是,如果我刷新页面,它会下载文件......但仍然会在那里保留垃圾文本输出。需要查看它是否只是在方法调用时呈现错误的页面?不知道该怎么办。我看到重复问题的相似之处,但我无法轻易将答案应用于我自己的程序。
  • 我遇到了完全相同的问题,我使用的是 rails 6。我也将处置设置为“附件”。当我重新加载它下载的页面时,而不是当我点击链接时。我还在电子邮件中提供了指向同一控制器功能的链接,并且效果很好。只是页面上的链接不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多