如何使用Sinatra,haml,nginx和乘客进行大file upload?

我需要能够让用户一次上传30-60 MB的文件。 现在,我正在用一个简单的表单来解决这个问题:

%form{:action=>"/Upload",:method=>"post",:enctype=>"multipart/form-data"} - @theModelHash.each do |key,value| %br %input{:type=>"checkbox", :name=>"#{key}", :value=>1, :checked=>value} =key %br %input{:type=>"file",:name=>"file"} %input{:type=>"submit",:value=>"Upload"} 

这种forms允许用户select包含在模型哈希中的处理选项并上传文件进行处理。 问题是,这种方法既冻结用户的用户界面,也要求当用户按下“后退”button时,整个表单被重新发布。

我已经看了SWFUpload ,但不知道如何将它集成到我的相对简单的应用程序。 这里有一个关于将其与Rails集成的页面 ,但是我使用Sinatra,并且对于整个Web编程来说已经足够新,我不知道如何修改这些文件来处理我需要做的事情。

有没有一个如何将大file upload到我的表单? 一些相对简单的东西,只是添加在进度条,不重新发布? 我觉得我必须将应用程序的大小增加三倍,才能使这个function发挥出色,这让我感到困扰。

这个过程通常如下:(来自four.livejournal.com/730831.html)

HTTP上传进度条相当混乱 – 它们通常涉及在服务器上运行的进程,跟踪HTTP服务器正在写入的临时文件的大小,然后在客户端每隔几秒向服务器发送一次AJAX调用上传要求上传的进度。

为了做到这一点,你需要在你的web服务器(不pipe是apache(1),nginx(2)还是lighttpd(3))上安装一个模块。 这意味着你不能作为一个独立的( ruby sinatraapp.rb )来运行你的Sinatra应用程序,但是你必须运行它(4)上述的一个Web服务器。 最简单的方法是使用Passenger(5)。

对于客户端AJAX轮询,请尝试Ajax上传(6)。

HTH!

链接

  • (1):piotrsarnacki.com/2008/06/18/upload-progress-bar-with-mod_passenger-and-apache/
  • (2):wiki.nginx.org/NginxHttpUploadProgressModule
  • (3):redmine.lighttpd.net/wiki/1/Docs:ModUploadProgress
  • (4):blog.zerosum.org/2008/7/4/passenger-3-sinatra
  • (5):modrails.com/
  • (6):valums.com/ajax-upload/

您可以通过以下链接获取上传进度: http : //github.com/drogus/apache-upload-progress-module

我没有使用任何自包含模块作为file upload。