Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails通过web服务调用时发送\ u文件而不发送数据_Ruby On Rails 3_Sendfile_Chunked - Fatal编程技术网

Ruby on rails 3 Rails通过web服务调用时发送\ u文件而不发送数据

Ruby on rails 3 Rails通过web服务调用时发送\ u文件而不发送数据,ruby-on-rails-3,sendfile,chunked,Ruby On Rails 3,Sendfile,Chunked,我遇到了一个奇怪的情况,send_file无法正确发送文件。情况如下: Rail版本:3.0.10和3.1.0[用于测试的两个不同分支] Ruby:RVM上的1.9.2 Webserver:apachewithpassenger 我的客户有一个文件管理系统;我致力于从Rails2升级到Rails3(现在是Rails3.1)。我们主要是重新开发这个系统,因为早期的系统很旧。除一个功能外,所有功能都正常工作。该应用程序允许用户下载分配给他们的文档。当用户登录时,他们可以看到分配给他们的文档,并可以下

我遇到了一个奇怪的情况,send_file无法正确发送文件。情况如下:

Rail版本:3.0.10和3.1.0[用于测试的两个不同分支] Ruby:RVM上的1.9.2 Webserver:apachewithpassenger

我的客户有一个文件管理系统;我致力于从Rails2升级到Rails3(现在是Rails3.1)。我们主要是重新开发这个系统,因为早期的系统很旧。除一个功能外,所有功能都正常工作。该应用程序允许用户下载分配给他们的文档。当用户登录时,他们可以看到分配给他们的文档,并可以下载。它工作得非常好。以下是有效的代码:

send_file(document.file[:path],
                    :type => document.file[:content_type],:x_sendfile=>true, :filename=>document.name)
有一个客户机,他们(我的客户机)为其制定了早期解决方案,在通过基于.NET的web服务(或任何可能被称为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服务的服务器

我和开发.NETWeb服务的开发人员通了电话,他说他所有的标题都是正确的,只是内容长度是-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
作为一种解决方法,我尝试将_重定向到,而不是发送文件,并在公用文件夹中使用了一个测试文件,效果良好。虽然不安全,但这似乎工作良好。唯一的问题是浏览器现在正在打开文档,而不是下载文档

请帮帮我


更新:问题与Rails现在发送分块内容,web服务期望内容长度有关。

发送文件没有问题。这就是.NETWeb服务的编程方式。它期望内容长度

发送内容时,默认行为发生了变化(Rails 2和Rails3之间)。现在它是分块的内容-因此不能有内容长度

NET的家伙修改了代码,现在一切都正常了!希望这能帮助别人