我处于一种奇怪的情况,即 send_file 无法正确发送文件。这是情况:
Rail 版本:3.0.10 和 3.1.0 [两个不同的测试分支] Ruby:1.9.2 on RVM Webserver:Apache with Passenger
我的客户有一个文件管理系统;我致力于将它从 Rails 2 升级到 Rails 3(现在是 Rails 3.1)。我们主要重新开发了这个系统,因为早期的系统已经很老了。除了一个之外,所有功能都可以正常工作。该应用程序允许用户下载分配给他们的文档。当用户登录时,他们可以看到分配给他们的文档并可以下载。它工作得很好。这是有效的代码:
send_file(document.file[:path],
:type => document.file[:content_type],:x_sendfile=>true, :filename=>document.name)
有一个客户,他们(我的客户)已经为他们制定了早期的解决方案,以便在通过基于 .NET 的 Web 服务(或任何可能被调用的服务)请求时发送文档。Web 服务以用户身份进行身份验证,然后转发到文档下载路径。我能够使 Web 服务进行身份验证,然后重定向到下载文件的控制器操作,但它不起作用。服务器日志说一切正常:
Started GET "/download/12234" for 12.123.12.123 at 2011-09-20 23:21:24 -0400
Processing by DocumentController#download as HTML
Parameters: {"id"=>"12234"}
Sent file /yyy/zzz/abc/12234 (0.1ms)
Completed 200 OK in 138ms
我已经更改了特定的名称和 IP。请注意,IP (12.123.12.123) 用于托管 Web 服务的服务器。
我正在与开发 .NET Web 服务的开发人员通话,他说除了内容长度为 -1 并且他没有收到任何内容外,他得到了所有的标头正确。他说所有其他标题都是正确的。
解决问题;我通过尝试设置所有可能的选项(x_sendfile、流、处置等)尝试了 send_file 的多种变体。我还尝试设置标题:
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
但是当我使用 Web 服务下载文件时,没有任何效果。但是,相同的方法直接在浏览器中工作[我通过绕过代码中的身份验证进行测试]。
我尝试使用 send_date,但它不起作用:
File.open(document.file[:path], 'r') do |f|
send_data f.read, :type => document.file[:content_type], :filename => document.name, :disposition => 'inline'
end
作为一种解决方法,我尝试了 redirect_to 而不是发送文件,并在公用文件夹中使用了一个测试文件,它可以工作。虽然不安全,但这似乎工作正常。唯一的问题是浏览器现在正在打开文档而不是下载它。
请帮我。
更新:问题与 Rails 现在发送分块内容和 Web 服务期望内容长度有关。