Ответ 1
Я рассматривал эту проблему на нескольких сайтах, используя несколько методов, которые вы проиллюстрировали выше, и некоторые из них, которых у вас нет. Хорошей новостью является то, что на самом деле довольно реалистично допускать массовые загрузки.
Многое зависит от того, что вы на самом деле планируете делать с файлом после того, как вы его загрузили... Чем больше работы вы будете делать в файле, тем ближе вы захотите его на свой сервер. Если вам нужно выполнить немедленную обработку при загрузке, вы, вероятно, захотите сделать чистое решение для рельсов. Если вам не нужно выполнять какую-либо обработку, или это не критично, вы можете начать рассматривать "гибридные" решения...
Верьте или нет, мне действительно повезло, просто используя mod_porter. Mod_porter заставляет apache выполнять кучу работы, которую обычно выполняет ваше приложение. Это помогает не связывать поток и кучу памяти во время загрузки. Это приводит к локальному файлу вашего приложения, что упрощает его обработку. Если вы обратите внимание на то, как вы обрабатываете загруженные файлы (подумайте о потоках), вы можете заставить весь процесс использовать очень мало памяти, даже для того, что традиционно было бы довольно дорогостоящими операциями. Этот подход требует очень небольшой фактической настройки для вашего приложения, чтобы он работал, и никакой реальной модификации вашего кода, но для этого требуется конкретная среда (сервер Apache), а также возможность ее настройки.
Мне также повезло с помощью jQuery-File-Upload, который поддерживает хорошие вещи, такие как загруженные и возобновляемые загрузки. Без чего-то вроде mod_porter это может по-прежнему связывать весь поток выполнения во время загрузки, но при этом он должен быть приличным в памяти, если все сделано правильно. Это также приводит к тому, что файл "закрывается" и, как результат, легко обрабатывается. Этот подход потребует корректировки уровня вашего представления для реализации и не будет работать во всех браузерах.
Вы упомянули FTP и bittorrent как возможные варианты. Это не так плохо, как вы думаете, поскольку вы все равно можете получить файлы, близкие к серверу. Они даже не являются взаимоисключающими, что приятно, потому что (как вы указали) им нужен дополнительный клиент, который может или не может присутствовать на загружающей машине. Как это работает, в основном, вы создали область для них, чтобы свалить на то, что видно вашему приложению. Затем, если вам нужно выполнить какую-либо обработку, вы запускаете задание cron (или что-то еще), чтобы отслеживать это местоположение для загрузки и запускать метод обработки ваших серверов. Это не дает вам немедленного ответа, который могут предоставить вышеприведенные методы, но вы можете установить интервал настолько малым, чтобы приближаться. Единственное реальное преимущество этого метода заключается в том, что используемые протоколы лучше подходят для передачи больших файлов, дополнительные требования к клиенту и фрагментированный процесс обычно перевешивают любые выгоды от этого, по моему опыту.
Если вам вообще не нужна какая-либо обработка, лучшим вариантом может быть просто перейти к S3 с ними. Это решение падает во втором, что вам действительно нужно делать с файлами, отличными от серверов, в качестве статических активов....
У меня нет опыта использования HTML5 FileSystemAPI в приложении rails, поэтому я не могу говорить с этой точкой, хотя кажется, что это значительно ограничит клиентов, которые вы можете поддерживать.
К сожалению, нет ни одной настоящей серебряной пули. Все эти параметры должны быть сопоставлены с вашей средой в контексте того, что вы пытаетесь выполнить. Например, вы не сможете настроить свой веб-сервер или надолго писать в свою локальную файловую систему. Для чего это стоит, я думаю, что jQuery-File-Upload, вероятно, лучший выбор в большинстве сред, поскольку он действительно требует модификации для вашего приложения, поэтому вы можете легко перенести реализацию в другую среду.