事件机器:如何接收文件上传?

时间:2012-02-08 01:04:32

标签: ruby eventmachine

对于普通的Ruby / Rails应用程序来说,这有点不同寻常。我正在构建一个主要在Event Machine上运行的应用程序。有一些HTML文件是从WEBrick提供的,但大多数应用程序使用javascript运行客户端,并通过Web Socket连接到我的Event Machine应用程序。我需要能够接受文件上传并在本地存储它们。怎么办呢?

更新:如果您有兴趣,here is a link to the source code

3 个答案:

答案 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生成新线程以管理文件上载而不会阻止您的反应器。