Назад | Перейти на главную страницу

Как я могу загрузить большой файл с помощью Sinatra, haml, nginx и пассажира?

Мне нужно разрешить пользователю загружать файлы размером 30-60 МБ за раз. Прямо сейчас я решаю проблему простым сообщением формы:

%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"}

Эта форма позволяет пользователю выбрать параметры обработки, содержащиеся в ModelHash, и загрузить файл для обработки. Проблема в том, что этот метод как замораживает пользовательский интерфейс, так и требует, чтобы вся форма была повторно размещена, когда пользователь нажимает кнопку «назад».

Я смотрел на SWFUpload, но понятия не имею, как интегрировать это в мое относительно простое приложение. Есть страница здесь об интеграции его с Rails, но я использую Sinatra, и я достаточно новичок во всем этом веб-программировании, поэтому я не знаю, как изменить эти файлы для работы с тем, что мне нужно делать.

Есть ли там инструкции по добавлению больших файлов для загрузки в мою форму? Что-то относительно простое, которое просто добавляет индикатор выполнения и не публикует репост? Я чувствую, что мне нужно утроить размер моего приложения, чтобы эта функция работала хорошо, и это меня немного беспокоит.

Процесс обычно следующий: (с сайта four.livejournal.com/730831.html)

Индикаторы выполнения HTTP-загрузки довольно запутаны - они обычно включают процесс, запущенный на сервере, отслеживающий размер временного файла, в который записывает HTTP-сервер, затем на стороне клиента каждые пару секунд выполняется вызов AJAX на сервер во время загрузка, чтобы узнать о ходе загрузки.

Для этого вам необходимо установить модуль на свой веб-сервер (будь то apache (1), nginx (2) или lighttpd (3)). Это означает, что вы не можете запускать приложение Sinatra как автономное (ruby sinatraapp.rb), но вы должны запустить его через (4) один из вышеупомянутых веб-серверов. Самый простой способ - использовать Passenger (5).

Для опроса AJAX на стороне клиента попробуйте Ajax Upload (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

Я не использовал никаких автономных модулей как таковых для загрузки файлов.