Rails send_file在通过Web服务调用时不发送数据

时间:2011-09-21 03:46:53

标签: ruby-on-rails-3 sendfile chunked

我处于一种奇怪的情况,即send_file无法正确发送文件。情况如下:

铁路版:3.0.10和3.1.0 [两个不同的分支进行测试] Ruby:RVM上的1.9.2 网络服务器:带乘客的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并且他没有收到任何内容外,他的所有标题都正确。他说所有其他标题都是正确的。

解决问题;我尝试设置所有可能的选项(x_sendfile,stream,disposition等)尝试了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服务期望内容长度有关。

1 个答案:

答案 0 :(得分:1)

send_file不是问题。这就是.NET Web服务的编程方式。它期待内容长度。

发送内容时,默认行为中存在更改(Rails 2和Rails3之间)。现在它是分块内容 - 所以不能有内容长度。

.NET家伙改变了代码,现在一切正常!希望这会对某人有所帮助。