2012-12-30 2 views
1

나는 sinatra를 사용하여 웹 애플리케이션을 구축 중입니다. 기본적으로 페이지 URL을 요청으로 취하고 페이지에서 미디어 파일에 대한 링크를 가져옵니다. 일단 검색되면 미디어 파일에 대한 스트림이 열립니다. 이제이 스트림을 클라이언트에 http 응답으로 보내려고합니다. 나는 다음을 시도했다.url에서 가져온 데이터 스트림을 루비의 http respone으로 보냅니다.

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 

또한이

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

그러나도 작동합니다. 미디어 파일을 로컬 파일에 저장하려고 시도했지만 제대로 저장하지 않았습니다. 그러나 스트림으로 작성하려고하면 데이터가없는 것으로 응답합니다. 내가 놓친 게 있니? 또는 sinatra는 한 스트림에서 다른 스트림으로 바이너리 쓰기를 허용하지 않습니다.

+0

스트리밍을 지원하는 웹 서버를 사용하고 있습니까? 또는 산탄 총을 사용하고 있습니까? "스트리밍 동작, 특히 동시 요청 수는 응용 프로그램을 제공하는 데 사용되는 웹 서버에 따라 크게 달라질 수 있습니다 .WIBRick과 같은 일부 서버는 스트리밍을 전혀 지원하지 않을 수도 있습니다 .Sinatra 문서는 다음과 같이 말합니다. 스트리밍을 지원하지 않는다면, 블록은 스트림 실행이 끝나면 즉시 보내질 것입니다. 스트리밍은 샷건에서 전혀 작동하지 않습니다. " – slm

답변

0

한 가지 문제는 요청을 제대로하지 않는 것입니다. http request 이렇게 만들려면 :

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 

그러나 스트리밍에는 작동하지 않습니다. 다음은 도움이되는 자습서입니다. http://www.intridea.com/blog/2012/5/24/building-streaming-rest-apis-with-ruby#

관련 문제