我处于send_file无法正确发送文件的奇怪情况。这里的情况:Rails send_file在通过Web服务调用时不发送数据
铁路版本:3.0.10和3.1.0 [两个用于测试不同的分支] 红宝石:1.9.2对RVM 网络服务器:Apache加上客运
我的客户有一个文档管理系统;我从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且他没有收到任何内容外,他得到的所有标题都是正确的。他说所有其他标题都是正确的。
为了解决这个问题,我试图由send_file的多种变化,试图将所有可能的选项(x_sendfile,流,处置等)。我也尝试设置标题:
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服务期望内容长度有关。