2012-01-24 9 views
3

をストリーミングアップロードするには、これらのようなストリーミング体にPOSTをアップロードする大きなファイルを扱うシナトラアプリのルートを持ってすることが可能です:シナトラが

uri = URI('http://0.0.0.0:4567/files') 
file = File.open("/path/to/1.iso") 
req = Net::HTTP::Post.new(uri.path) 

req.content_type   = 'application/octet-stream' 
req['Transfer-Encoding'] = 'chunked' 
req.body_stream   = file 

Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(req) 
end 

これは、現在、Webサービスのためである、私はどのように処理するかを見ることができませんこれと私は私の実際のルートにこの要求を発行しようとしていた。

post '/file' do 
    File.open('/path/to/downloaded.iso', 'ab') do |file| 
    file << request.body.read 
    end 
end 

しかし、それは明らかで失敗:

`!! Unexpected error while processing request: closed stream` 

また、動作しないストリーミングバージョンを取得できません。

本当にありがとうございます、ありがとうございました。

答えて

3
req['Transfer-Encoding'] 

はアップロードにチャンクエンコーディングを使用するためにはNet :: HTTPを強制するが、唯一のあなたのシナトラは、それがチャンクされていると思わせるものではありません。チャンクアップロードを実装するには、this gistを参照してください。

Exconは、this commitの後にチャンクアップロードを実装する優れたHTTP Rubyクライアントです。

関連する問題