如何使用 Sinatra、haml、nginx 和 Passenger 上传大文件?

如何使用 Sinatra、haml、nginx 和 Passenger 上传大文件?

我需要能够允许用户一次上传 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"}

此表单允许用户选择包含在 theModelHash 中的处理选项并上传文件进行处理。问题是,这种方法不仅会冻结用户的 UI,而且还要求在用户按下“后退”按钮时重新发布整个表单。

我看过SWF上传,但不知道如何将其集成到我相对简单的应用程序中。此处有一页关于将其与 Rails 集成,但是我正在使用 Sinatra,并且对整个 Web 编程还不够熟悉,我不知道如何修改这些文件以完成我需要做的事情。

有没有办法将大型文件上传功能添加到我的表单中?相对简单一点,只需添加进度条,无需重新发布?我觉得我必须将应用程序的大小增加三倍才能让这个功能正常使用,这让我有点困扰。

答案1

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

HTTP 上传进度条相当模糊 - 它们通常涉及在服务器上运行的一个进程,跟踪 HTTP 服务器正在写入的临时文件的大小,然后在客户端在上传过程中每隔几秒钟向服务器发出一次 AJAX 调用以询问上传的进度。

为了实现这一点,您需要在 Web 服务器上安装一个模块(可以是 apache(1)、nginx(2) 或 lighttpd(3))。这意味着您不能将 Sinatra 应用程序作为独立程序运行(ruby sinatraapp.rb),而必须通过上述 Web 服务器之一运行它(4)。最简单的方法是使用 Passenger(5)。

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

呼呼!

链接

  • (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/

答案2

您可以使用以下方式获取上传进度: http://github.com/drogus/apache-upload-progress-module

我没有使用任何独立的模块来进行文件上传。

相关内容