上传的解剖

时间:2011-02-24 06:46:00

标签: javascript ruby-on-rails

我想知道上传中等大小文件的一般共识是什么。我有一个Web应用程序,每次用户上传文件(通常大于5mb)时,Web服务器都会挂起,直到文件上传完成。

以上看似乎很正常,因为单个上传可以占用一个HTTP请求处理程序。网络开发人员是否考虑到了这一点:

a)支付更多HTTP处理程序

b)使用其他方法通过使用AJAX或其他方法

来解决这个问题

我听说网络应用程序有一些HTTP请求处理程序来处理这种情况是很正常的,这将花费更多。另一方面,如果成本是一个问题,那么有些人建议尝试直接通过Flash + AJAX直接上传到Web服务器或存储服务(即Amazon S3)。后一种方法需要一些脚本,并且有点混乱。

我的第二个问题:

使用ajax将文件上传到服务器上。这仍然占用整个HTTP请求处理程序吗?即服务器是否挂起,直到上传完成?

即使使用闪存,我仍然需要指定要上传的网址。该url将是我的控制器上的操作之一。这意味着处理仍然发生在服务器端。到目前为止这是对的吗?

我在想。另一方面,如果我使用其中一个上传脚本(plupload,uploadify,swfupload等)直接上传到Amazon S3,则处理将在S3服务器而不是本地Web服务器上处理。哪个不会挂起网络应用程序。我能正确理解吗?

希望听到您的反馈意见。

4 个答案:

答案 0 :(得分:1)

对于大型上传,您应该使用非阻塞,偶像服务器,如Node.js,Twisted on Pyhon, Perl上的AnyEvent或Ruby上的EventMachine。对于长时间运行的连接,使用每个连接的线程模型太贵了。

Node.js用户拥有如此多的同时连接并且他们实际上仍然没有使用他们的所有资源,这种情况并不少见 - 例如,请参阅this question被某人担心的问题只有30个同时连接,然后设法在具有4GB RAM的单个服务器上访问超过6万个连接。

关键是,如果您担心阻止服务器提供新请求的连接,那么您首先不应该使用阻止服务器。

答案 1 :(得分:0)

我目前正在开发一款可同时处理多张图片上传的网络应用。我研究得很广泛,我找到的最佳选择是 swfupload 。它非常易于实现和高度可定制。用户可以从对话框中选择多个文件,将它们添加到队列中,并从浏览器获得实际的进度反馈。因此,滞后对用户来说并不是一件大事。

虽然,bah .....它使用flash初始化对话框,但其他一切都是用旧的javascript处理的。

一个很好的工作示例是carbonmade.com

答案 2 :(得分:0)

感谢目前为止的回复。

不幸的是,我们的主机Heroku不支持非阻塞,事件服务器。我也尝试过基于flash + javascript的上传程序,如SWFUpload,Uploadify。所提到的插件的一些变体起作用,而一些则没有。花了无数个小时的试验和错误,但不喜欢代码是如何集成在我的Rails应用程序上的。

最后,在link之后直接手动将文件上传到S3。这也使得来自S3服务器的响应能够通知我们上传成功,为我们提供上传文件的路径,以便我们可以创建后台作业(通过redis + resque)来处理文件。

答案 3 :(得分:0)

将来如果您要通过Rails直接上传到S3,请查看下面的示例项目。你会为自己省去许多令人头疼的问题而且它并不是很“混乱”:)

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

示例项目使用Rails 3,Flash / Silverlight / GoogleGears / BrowserPlus和基于jQuery的Plupload直接上传到S3:https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

顺便说一句,您可以使用Paperclip进行后期处理,使用类似此博客文章描述的内容:

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