我需要编写一个Java客户端应用程序,当给出以下URL时,它将在其下面递归地枚举目录/文件。我还需要为每个时间戳获取最后修改的时间戳,因为我只关注自已知时间戳以来的更改。
http://www.myserver.com/testproduct/
例如,假设服务器上存在以下内容。
http://www.myserver.com/testproduct/red/file1.txt
http://www.myserver.com/testproduct/red/file2.txt
http://www.myserver.com/testproduct/red/black/file3.txt
http://www.myserver.com/testproduct/red/black/file4.txt
http://www.myserver.com/testproduct/orange/anotherfile.html
http://www.myserver.com/testproduct/orange/mymovie.avi
http://www.myserver.com/testproduct/readme.txt
我需要从指定的URL(http://www.myserver.com/testproduct/)开始,在其下面递归地枚举目录和文件以及每个目录和文件的最后修改时间戳。一旦我有目录/文件列表,我将根据时间戳和其他客户端过滤器有选择地下载一些文件。
服务器正在运行Apache,并配置为允许目录列表。
我使用Apache的HttpClient Java类进行了一些实验,当我请求http://www.myserver.com/testproduct/的内容时,我得到了一个HTML文件,当然,如果你在浏览器中找到它,你会看到同样的事情。它是一个显示文件夹内容的HTML页面。
这是唯一的方法吗?即抓取生成的HTML页面来解析文件和目录?另外,我不确定我能否根据返回的HTML
可靠地区分文件和目录有没有更好的方法来枚举目录和文件,而不会抓取结果HTML?
答案 0 :(得分:1)
如果您对服务器有任何控制权,您应该要求他们实施WebDAV,这正是针对这种情况的。 Apache附带一个只需要配置的mod_dav
。在Java客户端,请参阅this question
答案 1 :(得分:1)
如果您的应用程序与服务器不在同一台计算机上,那么除了您正在寻找的数据之外,您无能为力。如果您了解服务器上存在的所有产品,那么您只需为每个文件发出Web请求,您就可以获得它们。但是,如果您只了解根路径或单个产品页面,那么您基本上必须抓取该网站并从同一网站提取指向其他产品的链接。您只能选择要抓取的网址,如果它们位于同一主机上,而您之前没有看到/抓取过它们。
例如:
如果http://www.myserver.com/testproduct/
包含指向
http://www.myserver.com/testproduct/red/file1.txt
http://www.myserver.com/testproduct/red/file2.txt
http://www.devboost.com/
http://www.myspace.com/
http://blog.devboost.com/
http://beta.devboost.com/
http://www.myserver.com/testproduct/red/file2.txt
然后,您将忽略任何不以主机www.myserver.com
开头的链接。
关于目录和时间戳:正如评论中所指出的,HTTP不支持目录浏览,如果你在上次修改文件时试图获取时间戳,那么你也不幸在那个。< / p>
更重要的是,我不知道当该文件生成动态内容时,知道文件没有被更改会对您有多大帮助。例如:负责显示产品页面的文件很可能在很长时间内没有变化。通常,同一文件将负责显示数据库中的所有产品,以及它是否是MVC类型框架的一部分。换句话说:您必须解析HTML并确定是否有任何您关心的更改,然后相应地处理该文件。