2011-09-21 44 views
0

我处于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服务期望内容长度有关。

回答

1

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

发送内容时,默认行为有一个变化(Rails 2 & Rails3)。现在它是分块内容 - 所以不能有内容长度。

.NET人改变了代码,现在一切正常工作!希望这会有助于某人。

相关问题