2012-02-08 46 views
4

這對於普通的Ruby/Rails應用程序來說有點不同尋常。我正在構建一個主要在Event Machine上運行的應用程序。有幾個HTML文件是從WEBrick提供的,但大多數應用程序都運行在客戶端,使用JavaScript,並通過Web Socket連接到我的Event Machine應用程序。我需要能夠接受文件上傳並將其存儲在本地。如何才能做到這一點?事件機器:如何接收文件上傳?

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

+0

查看HTTP中'multipart/form-data'的規範並複製該方法。 – millimoose 2012-02-08 01:09:48

+0

當谷歌搜索「HTTP文件上傳」。例如。這裏:http://www.faqs.org/rfcs/rfc1867.html和更非正式的,在這裏:http://www.vivtek.com/rfc1867.html – millimoose 2012-02-08 23:27:30

+0

這將有助於:https://github.com/igrigorik/em-websocket 以下鏈接(server.rb)上的代碼可能會有所幫助,唯一需要注意的是它使用Sinatra,但是您可以(希望)輕鬆地將其修改爲WEBrick:https://github.com/thirtysixthspan/waterunderice – 2012-02-15 12:11:02

回答

1

首先這裏是如何建立與西納特拉一個簡單的文件上傳: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上找到它)。

編輯:另一種解決方案是使用巨人作爲Web服務器,你有一個例子在這裏:https://github.com/postrank-labs/goliath/blob/master/examples/async_upload.rb 如果您不需要顯示你應該留在西納特拉+ nginx的/ Apache的上傳進度。

0

如果您需要上傳來通過網絡套接字連接,因此不能使用標準的Rails控制器來做到這一點,請使用EventMachine.defer來產生一個新線程來管理文件上傳而不會阻塞您的反應器。

+0

你能詳細說一下嗎?顯然,我不能使用Rails控制器,因爲我沒有使用Rails。但是,我如何告訴EventMachine我希望它能「管理文件上傳」? – Andrew 2012-02-15 21:06:53

+0

結帳https://github.com/thirtysixthspan/waterunderice – Joshua 2012-02-15 21:23:08