2011-02-24 22 views
8

我想知道上傳中等大文件的普遍共識是什麼。我有一個網絡應用程序,並且每當用戶上傳一個文件(通常大於5mb)時,Web服務器往往會掛起,直到文件上傳完成。上傳的解剖結構

上面看起來很正常,因爲單個上傳可以佔用一個HTTP請求處理程序。做web開發者考慮到這一點,並且:

一)對多個HTTP處理程序

b)利用一些其他的方法,通過使用AJAX或其他方式

聽說已經克服這種支付Web應用程序有幾個HTTP請求處理程序來處理這個問題是非常正常的,這會花費更多的代價。另一方面,如果成本問題,則有人建議直接通過Flash + AJAX直接上傳到Web服務器或存儲服務(如Amazon S3)。後一種方法需要一些腳本,並且有點麻煩。

我的第二個問題:

通過使用Ajax文件上傳到服務器。這仍然佔用一個完整的HTTP請求處理程序嗎?即服務器是否掛起直到上傳完成?

即使使用閃光燈,我仍然需要指定要上傳的網址。該網址將是我的控制器上的一個操作。這意味着處理仍然發生在服務器端。這到目前爲止是否正確?

我在想。另一方面,如果我使用其中一個上傳腳本(plupload,uploadify,swfupload等)直接上傳到Amazon S3,則在S3服務器上而不是本地Web服務器上處理該處理。根本不會掛上網絡應用程序。我是否正確理解這一點?

想聽聽您的意見。

回答

0

感謝迄今的迴應。

不幸的是,我們的主機Heroku不支持非阻塞的服務器。我也嘗試過基於Flash + JavaScript的上傳器,如SWFUpload,Uploadify。提到的插件的一些變化工作,有些並沒有。花了無數小時的試驗和錯誤,但不喜歡代碼被集成到我的Rails應用程序中。

最後,直接在link之後手動上傳文件到S3。這也使得S3服務器的響應能夠通知我們上傳成功了,爲我們提供了上傳文件的路徑,以便我們可以創建後臺作業(通過redis + resque)來處理文件。

1

對於較大的上傳,您應該使用非阻塞服務器,如Node.js,Pyhon上的Twisted, Perl上的AnyEvent或Ruby上的EventMachine。使用每個連接線程模型對於長時間運行的連接來說太昂貴了。

Node.js用戶有這麼多併發連接,他們實際上達到了他們的操作系統限制,同時還沒有使用他們所有的資源 - 例如見this question被某人擔心只有30 一千個同時連接,然後設法達到超過60000個連接在一個單一的服務器與4GB的RAM。

問題是,如果你擔心你的連接阻塞你的服務器來提供新的請求,那麼你不應該首先使用阻塞服務器。

+0

嗯,我正在使用Heroku,這是一個託管的Ruby on Rails的Web主機。我問他們是否支持這些非阻塞的服務器之一。如果他們不這樣做,那我還有什麼其他選擇? – 2011-02-24 12:16:42

0

我目前正在開發一個Web應用程序,它可以同時處理多個圖像上傳。我研究的範圍很廣,我發現的最佳選擇是swfupload。這是非常容易實施和高度可定製的。用戶可以從對話框中選擇多個文件,將它們添加到隊列中,並從瀏覽器獲取實際進度反饋。所以這對用戶來說並不是什麼大不了的事情。

雖然,唉.....它使用閃存初始化對話框,但其他一切都用良好的舊javascript處理。

一個偉大的工作例子是carbonmade.com

+0

這意味着您正在使用swfupload將文件直接上傳到服務器或存儲服務上? – 2011-02-24 07:16:37

+0

我們正在上傳到雲服務器並將它們存儲在本地服務器上。效果很好。 – 2011-02-24 07:24:47

0

未來如果您打算通過Rails直接上傳到S3,請查看下面的示例項目。你會救自己很多很多的麻煩,它是不是很「凌亂」 :)

示例項目使用Rails 3,Flash和基於MooTools的-FancyUploader直接上傳到S3:https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

示例項目使用Rails 3,閃存/ Silverlight的/ GoogleGears /的BrowserPlus和基於jQuery的Plupload直接上傳到S3:https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

順便說一句,你可以使用像這樣的博客文章介紹做後期處理回形針:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip