Event Machine: Как получить закачки файлов? - PullRequest
4 голосов
/ 08 февраля 2012

Это немного необычно для обычного Ruby / Rails-приложения. Я создаю приложение, которое в основном работает поверх Event Machine. Есть несколько HTML-файлов, которые обслуживаются через WEBrick, но большинство приложений работает на стороне клиента с javascript, с подключением через веб-сокет к моему приложению Event Machine. Мне нужно иметь возможность принимать загружаемые файлы и хранить их локально. Как это можно сделать?

Обновление: Если вам интересно, вот ссылка на исходный код .

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Пожалуйста, посмотрите на этот проект на GitHub: http://www.github.com/igrigorik/em-websocket

Код по следующей ссылке (код в server.rb может быть отправной точкой), единственное предостережение - использование Sinatra, но вы можете (надеюсь) легко адаптировать его для WEBrick: http://www.github.com/thirtysixthspan/waterunderice

1 голос
/ 16 февраля 2012

Сначала вот как создать простую загрузку файлов с помощью sinatra: Загрузка файлов с помощью Sinatra

Итак, теперь для запуска веб-сервера с thin можно сделать это в своем коде:

class MyWebApp < Sinatra::Base
  # here goes the sinatra app code
  post '/something' do
    # ...
  end
end

EM::run do
  Thin::Server.start('0.0.0.0', 8000) do
    map('/'){ run MyWebApp.new }
  end
end

thin использует eventmachine для внутренних целей, я полагаю, webrick использует потоки, но, честно говоря, я никогда не задумывался об этом.

Вы должны использовать apache или nginx перед процессом ruby, по крайней мере, для файлазагрузить (я думаю, что веб-сокеты не будут работать через него).Я могу включить простую конфигурацию nginx, если вам нужно (просто нужно найти ее на моем диске xD).

Редактировать: Другое решение - использовать Голиафа в качестве веб-сервера, у вас есть пример здесь: https://github.com/postrank-labs/goliath/blob/master/examples/async_upload.rb Если вам не нужно отображать процесс загрузки, вам следует использовать sinatra + nginx / apache.

0 голосов
/ 16 февраля 2012

Если вам нужно, чтобы загрузка осуществлялась через соединение через веб-сокет, и, следовательно, вы не можете использовать стандартные контроллеры Rails для этого, используйте EventMachine.defer, чтобы создать новый поток для управления загрузкой файлов без блокировки вашего реактора.

...