在ruby中以http响应的形式发送从url获取的数据流

在ruby中以http响应的形式发送从url获取的数据流,ruby,file-io,stream,sinatra,Ruby,File Io,Stream,Sinatra,我正在使用sinatra构建一个web应用程序。它基本上以页面的url作为请求,并从页面中获取指向媒体文件的链接。一旦检索到,它就会打开一个媒体文件流。现在我想把这个流作为http响应发送给客户端。我试图做到以下几点 get '/' do url=PM.link(params[:url]) puts url buf=nil open(url, 'rb') do |rf| while(buf=rf.read(1024)) do stream do |out|

我正在使用sinatra构建一个web应用程序。它基本上以页面的url作为请求,并从页面中获取指向媒体文件的链接。一旦检索到,它就会打开一个媒体文件流。现在我想把这个流作为http响应发送给客户端。我试图做到以下几点

get '/' do
  url=PM.link(params[:url])
  puts url
  buf=nil
  open(url, 'rb') do |rf|
    while(buf=rf.read(1024)) do
      stream do |out|
        out << buf
      end
    end  
  end
end

但两者都不起作用。我尝试将媒体文件存储在本地文件中,但它正确地存储了该文件。但当我尝试将其写入out stream时,它没有数据响应。我错过什么了吗?或者sinatra不允许将二进制文件从一个流写入另一个流。

一个问题是您没有正确地发出请求。要发出http请求,请执行以下操作:

然后,您可以对响应执行您想要的操作。在您的情况下,它可能如下所示:

get '/' do
  url=PM.link(params[:url])
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)

end

但是,这对流媒体不起作用。这里有一个教程可以帮助您:

您使用的是支持流媒体的web服务器吗?或者你在用猎枪?Sinatra文档说:请注意,流行为,特别是并发请求的数量,高度依赖于用于服务应用程序的web服务器。有些服务器,比如WEBRick,甚至可能根本不支持流媒体。如果服务器不支持流,则在传递给流的块完成执行后,将立即发送正文。使用散弹枪时,流媒体根本不起作用。
uri = URI.parse(yoururl)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
get '/' do
  url=PM.link(params[:url])
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)

end