2012-02-08 2 views
4

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

Обновление: Если вам интересно, here is a link to the source code.

+0

Посмотрите на спецификацию 'multipart/form-data' в HTTP и скопируйте этот подход. – millimoose

+0

Когда googling для загрузки HTTP-файла. Например. здесь: http: //www.faqs.org/rfcs/rfc1867.html и более неофициально, здесь: http://www.vivtek.com/rfc1867.html – millimoose

+0

Это поможет: https://github.com/igrigorik/em-websocket Возможно, код на следующей ссылке (server.rb) может помочь, единственное предостережение - использование Sinatra, но вы можете (надеюсь) легко адаптировать его для WEBrick: https://github.com/thirtysixthspan/waterunderice –

ответ

1

Первый здесь, как построить простую загрузку файлов с Синатрой: File upload with Sinatra

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

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 

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

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

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

0

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

+0

Не могли бы вы подробнее рассказать? Очевидно, я не могу использовать контроллеры Rails, потому что я не использую Rails. Но как сообщить EventMachine, что я хочу, чтобы он «управлял загрузкой файлов»? – Andrew

+0

Проверьте https://github.com/thirtysixthspan/waterunderice – Joshua

1

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

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

Смежные вопросы