Скачать каталог по HTTP в Java - PullRequest
1 голос
/ 12 ноября 2009

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

Кажется вероятным, что в каком-то темном углу Java существует простое / прямое / атомарное решение. Кто-нибудь знает, как это сделать?

Веб-сканер не решит мою проблему, поскольку файлы в подкаталогах могут ссылаться на каталоги, которые не являются подкаталогами.

== Обновление ==

Каталоги и файлы должны размещаться статическим образом.

Сервер статически размещает файлы в дереве каталогов, клиент запускает Java и пытается скопировать некоторую ветвь дерева каталогов, используя HTTP.

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

== Дальнейшее обновление ==

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

Ответы [ 7 ]

6 голосов
/ 12 ноября 2009

Моим первым предложением было бы создать сервлет / jsp, который recursiveley считывает структуру каталогов (используя java.io.File), читает все файлы, помещает их в один zip (java.util.zip) и отправляет его в браузеры для скачивания.

2 голосов
/ 12 ноября 2009

Итак, вы хотите со стороны клиента получить список всех файлов и директорий для определенного URL-адреса серверной стороны, как если бы это была папка локальной файловой системы на диске? Обычно это невозможно, если на сервере не включена индексация каталогов. И даже в этом случае вам все равно нужно проанализировать HTML-страницу, которая представляет индекс каталога, и самостоятельно проанализировать все элементы <a>, представляющие файлы и папки. Для этого нет нормального java.io.File подхода. Это была бы огромная дыра в безопасности. Например, можно было бы загрузить все исходные файлы из http://gmail.com. HTTP не подразумевается как протокол передачи file . Используйте FTP. Вот где он стоит.

2 голосов
/ 12 ноября 2009

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

Основываясь на этих ответах, теперь мне интересно, если вы имели в виду Java на стороне клиента или сервера!

1 голос
/ 12 ноября 2009

Поговорим о низко висящих фруктах ;-) Спасибо за предложение, e5!

Commons VFS предоставляет единый API для доступа к различным файловым системам. Он представляет собой единообразный вид файлов из различных источников, таких как файлы на локальном диске, на HTTP-сервере или внутри Zip-архива.

http://commons.apache.org/vfs/

1 голос
/ 12 ноября 2009

Предполагая, что у вас есть контроль над сервером и клиентом, я написал бы страницу (в вашей любимой технологии по вашему выбору: ASP, JSP, PHP и т. Д.), Которая читает структуру каталогов сервера и динамически возвращает страницу, которая состоит из связки ссылок на каждый загружаемый файл.

Затем на стороне клиента вы можете инициировать загрузку каждой ссылки.

Что такое технология на стороне клиента? Что делает загрузка какого-либо приложения или веб-браузера? Должен ли он иметь клиентский интерфейс?


Если это какая-то внутренняя служебная программа, может, вместо этого вы можете просто использовать FTP? Открыть FTP-доступ на сервере и загрузить каталог будет легко ...


Добавление еще одного возможного ответа:

Если на сервере не включены списки каталогов, вам, в основном, нужно внести изменения на стороне сервера. Проще всего сделать страницу, которая возвращает клиенту структуру dir в известном формате (см. Мой первый ответ выше).

Если вы управляете сервером и у вас есть списки каталогов, и , вы всегда используете одну и ту же серверную программу (IIS, Tomcat, JBoss и т. Д.), То вы можете просто выполнить клиентский веб-обход списки каталогов. Например, в списке каталогов из IIS вы можете указать, какие ссылки являются каталогами, а какие - файлами, потому что он всегда ставит «/» в конце ссылки на каталог и показывает «dir» вместо размера файла:

 Friday, October 16, 2009 03:55 PM        &lt;dir&gt; <A href="Unity/">Unity</A>
 Thursday, July 02, 2009 10:42 AM           95 <A href="Global.asax">Global.asax</A>

Здесь вы можете сказать, что 1-я ссылка является каталогом, а 2-я является действительным файлом.

Так что, если вы используете согласованное серверное приложение, просто посмотрите, как возвращается список каталогов. Может быть, вам повезет.

1 голос
/ 12 ноября 2009

Впервые за долгое время Google Beat StackOverflow Apache Commons VFS делает именно то, что мне нужно.

Commons VFS предоставляет единый API для доступ к различным файлам системы. Он представляет собой единый взгляд на файлы из разных разных источники, такие как файлы на локальном диск, на HTTP-сервере или внутри Zip архив.

http://commons.apache.org/vfs/

== Обновление ==

Как указано в вопросе, VFS только притворяется, что решает эту проблему, поскольку не допускает перечисления каталогов http.

1 голос
/ 12 ноября 2009

Если я не ошибаюсь, HTTP ничего не говорит вам о «структуре» серверной части - если такая вещь вообще существует.

Подумайте о REST, где URI на самом деле не говорит вам, где найти файл на сервере, а может просто вызвать какое-то действие, получить данные или тому подобное.

Так что я не думаю, что то, что вы пытаетесь достичь, может быть сделано надежно, будь то с помощью Java или любого другого языка. Или, может быть, я вас не так поняла?

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