我在目录树中有一些文件正在通过HTTP提供。 给定一些子目录A,在该目录树中,我希望能够下载目录A以及所有包含子目录和文件的目录。
Java的某个黑暗角落似乎存在简单/直接/原子解决方案。有谁知道怎么做?
由于子目录中的文件可能链接到非子目录的目录,因此webcrawler无法解决我的问题。
==更新==
目录和文件必须以静态方式托管。
服务器静态托管目录树中的文件,客户端正在运行Java并尝试使用HTTP复制目录树的某些分支。
VFS就是答案,不幸的是我自己回答了这个问题,因此在两天之后才能选择它作为答案。如果有人写下我的答案,我很乐意将他们的答案标记为答案。
==进一步更新==
VFS实际上不是答案。 VFS不会通过HTTP列出目录as stated here。似乎有一些人对该功能感兴趣。
答案 0 :(得分:6)
我的第一个建议是创建一个servlet / jsp,recursiveley读取目录结构(使用java.io.File),读取所有文件,将它们放在一个zip(java.util.zip)中,并将其发送到供下载的浏览器。
答案 1 :(得分:2)
我不知道原子解决方案,但最直接的解决方案是使用URLConnection获取子目录(假设服务器列出目录),然后解析响应,查找该目录的内容和再次使用URLConnection获取其下的每个文件。
基于这些答案,现在我想知道你是否认为Java是在客户端或服务器端!
答案 2 :(得分:2)
因此,您希望从客户端检索服务器端特定URL的所有文件和直接列表,就好像它是本地磁盘文件系统文件夹一样?当服务器没有启用目录索引时,这通常是不可能的。即便如此,您仍然需要解析代表目录索引的HTML页面并自行解析代表文件和文件夹的所有<a>
元素。对此没有正常的java.io.File
方法。那可能是一个巨大的安全漏洞。例如,可以从http://gmail.com下载所有源文件。 HTTP不是指文件传输协议。使用FTP。这就是它所代表的地方。
答案 3 :(得分:1)
如果我不是非常错误,HTTP不会告诉你任何有关服务器端“结构”的信息 - 如果这样的话甚至存在。
考虑REST,其中URI并不真正告诉您在服务器上找到文件的位置,但只能触发某些操作,检索数据等。
因此,我不认为您要实现的目标是可靠的,无论是使用Java还是其他任何语言。或许我在这里弄错了你?
答案 4 :(得分:1)
有史以来第一次谷歌击败stackoverflow,Apache commons VFS正是我所需要的。
Commons VFS为其提供单一API 访问各种不同的文件 系统。它呈现出统一的视角 各种不同的文件 来源,例如本地文件 磁盘,HTTP服务器或内部 Zip档案。
==更新==
如问题中所述,VFS仅假装解决此问题,因为它不允许列出http目录。
答案 5 :(得分:1)
假设您可以控制服务器和客户端,我会编写一个页面(使用您喜欢的技术; ASP,JSP,PHP等)来读取服务器目录结构,并动态返回一个页面一堆链接到每个要下载的文件。
然后,客户端可以触发每个链接的下载。
客户端技术是什么?是下载某种应用程序或Web浏览器的东西?是否必须有客户端界面?
如果这是某种内部实用程序,也许你只能用FTP代替?在服务器上打开FTP访问并下载目录很容易......
添加另一个可能的答案:
如果服务器没有打开目录列表,那么您基本上必须进行修改服务器端。最简单的方法是创建一个以已知格式将dir结构返回给客户端的页面(参见上面的第一个答案)。
如果您控制服务器并拥有目录列表,和,您总是使用相同的服务器程序(IIS,Tomcat,JBoss等),那么您可能只需要创建客户端webcrawl目录列表。例如,在IIS的目录列表中,您可以确定哪些链接是目录,哪些是文件,因为它总是在目录链接的末尾放置一个'/',并显示'dir'而不是文件大小:
Friday, October 16, 2009 03:55 PM <dir> <A href="Unity/">Unity</A>
Thursday, July 02, 2009 10:42 AM 95 <A href="Global.asax">Global.asax</A>
你可以告诉我们第一个链接是一个目录,第二个是实际文件。
因此,如果您使用的是一致的服务器应用程序,请查看目录列表的返回方式。也许你会幸运的。
答案 6 :(得分:1)
谈论低调的果实;-)感谢您的提议,e5!
Commons VFS提供了一个用于访问各种不同文件系统的API。它提供了来自各种不同来源的文件的统一视图,例如本地磁盘上的文件,HTTP服务器上或Zip归档内的文件。