Синатра загрузка потокового - PullRequest
3 голосов
/ 25 января 2012

Возможно ли иметь маршрут приложения sinatra, обрабатывающий большие файлы, загружаемые через 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

Это для веб-службы, в настоящее время я не могу понять, как с этим справиться, и я пытался выполнить этот запрос для моего фактического маршрута:

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`

Также нельзя заставить работать не потоковую версию.

Был бы очень признателен за любую помощь, спасибо.

1 Ответ

3 голосов
/ 23 марта 2012
req['Transfer-Encoding']

не заставляет Net :: HTTP использовать кусочную кодировку для загрузки, но только заставляет вашу синатру думать, что она кусочная.Пожалуйста, обратитесь к этой сущности , чтобы реализовать загрузку по частям.

Excon - хороший HTTP-клиент Ruby для реализации загрузок по частям после этой фиксации .

...