Самый надежный способ передачи больших файлов на удаленный сервер через Java?

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

Сейчас я склоняюсь к использованию Apache Commons Net (см.: http://commons.apache.org/net/ ) вместе с FTP для перемещения файлов с клиентского компьютера на сервер. Оказавшись там, я буду использовать безопасные вызовы API для перемещения файлов туда, куда им нужно.

Это лучший маршрут? Есть ли лучший способ надежной передачи больших (1 ГБ+) файлов? Есть ли способ возобновить прерванную загрузку, используя эту методологию? Я хотел бы избежать традиционных HTTP-запросов POST, поскольку они ненадежны и не могут возобновить прерванную загрузку.

Спасибо!


person FunnyLookinHat    schedule 16.02.2011    source источник
comment
Я не думаю, что вы можете восстановить разорванные соединения с вашим подходом. Как вы думаете, он поддерживает резюме?   -  person phillip    schedule 16.02.2011
comment
Я добился большого успеха, используя Commons Net для FTP, единственный большой сбой, который у меня был (и это может быть потому, что я использую более старую версию), это команда ls, если вы не правы режим передачи (пассивный, непассивный) просто зависает... без исключений, без сбоев, просто... висит...   -  person Shaded    schedule 16.02.2011
comment
Насколько я знаю, вы не можете возобновить разорванные соединения с Commons Net - так что это одна из причин, по которой я прошу совета... :) Также - спасибо за совет с пассивным или непассивным - вероятно, сэкономил мне немало времени. мало головной боли.   -  person FunnyLookinHat    schedule 16.02.2011


Ответы (2)


Вы не упомянули, можно ли использовать Amazon S3 для вашего решения, но они предлагают встроенную поддержку частичной загрузки. Основной рабочий процесс:

  1. Создайте заполнитель для загрузки и удерживайте клавишу ответа
  2. Загрузка фрагментов — может выполняться одновременно и повторяться по мере необходимости.
  3. Используйте клавишу ответа, чтобы объединить фрагменты в один файл.

Их SDK предлагает встроенную функцию нарезки файлов и загрузки фрагментов.

Даже если S3 не является конечным местом, вы можете использовать S3 в качестве ручки для загрузки и загрузить файл в удобное для вас время для постоянного хранения.

person Uriah Carpenter    schedule 16.02.2011
comment
Ну, мы используем Rackspace CloudFiles, которые скоро будут поддерживать загрузку по частям (я только что проверил их дорожную карту). Я даже не думал об этом. Спасибо за идею! - person FunnyLookinHat; 17.02.2011

Ваше понимание HTTP-сообщения не совсем верно. Стандарт HTTP не ограничивает запросы диапазона только методом GET — их также можно использовать с POST или PUT.

Кроме того, если у вас есть контроль как над клиентским, так и над серверным скриптом, вы можете опубликовать как фрагмент данных, так и позицию StartAt в качестве отдельного параметра. На сервере вы проверяете параметр и добавляете полученные данные в указанную позицию.

person Eugene Mayevski 'Callback    schedule 16.02.2011
comment
Ах да, я определенно мог бы вручную управлять данными таким образом, но я надеялся, что мне не придется делать слишком много на стороне сервера (т. Е. Разве колесо не было изобретено достаточно, чтобы я мог просто использовать чужое колесо?) :) - person FunnyLookinHat; 16.02.2011