对于普通的Ruby / Rails应用程序来说,这有点不同寻常。我正在构建一个主要在Event Machine上运行的应用程序。有一些HTML文件是从WEBrick提供的,但大多数应用程序使用javascript运行客户端,并通过Web Socket连接到我的Event Machine应用程序。我需要能够接受文件上传并在本地存储它们。怎么办呢?
更新:如果您有兴趣,here is a link to the source code。
答案 0 :(得分:1)
请在GitHub上查看这个项目:http://www.github.com/igrigorik/em-websocket
以下链接上的代码(server.rb中的代码可能是一个起点),唯一需要注意的是它使用Sinatra,但你可以(希望)轻松地将其改编为WEBrick:http://www.github.com/thirtysixthspan/waterunderice
答案 1 :(得分:1)
首先,如何使用sinatra构建一个简单的文件上传:File upload with Sinatra
现在,您可以在代码中运行您的Web服务器:
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使用线程但老实说我从未真正研究过它。
你应该在你的ruby进程前使用apache或nginx至少用于文件上传(我认为websockets不会通过它)。 如果需要,我可以包含一个简单的nginx配置(只需要在我的磁盘xD上找到它)。
编辑:另一个解决方案是使用goliath作为Web服务器,你有一个例子:https://github.com/postrank-labs/goliath/blob/master/examples/async_upload.rb 如果您不需要显示上传进度,您应该使用sinatra + nginx / apache。
答案 2 :(得分:0)
如果您需要通过Web套接字连接进行上传,因此无法使用标准Rails控制器执行此操作,请使用EventMachine.defer生成新线程以管理文件上载而不会阻止您的反应器。