我们的一个服务器中的文件可以通过http访问。因此,当我们调出类似于以下内容的URL时,我们会获得该位置的文件/目录列表:
http://mytestserver/files/
从这个列表中,我只需要选择那些匹配正则表达式格式的文件。
如果这是磁盘中的一个位置,我可以使用eachFileMatch方法并过滤我需要的文件。
有人可以帮助我如何从http网址执行此操作吗?
答案 0 :(得分:4)
@tim_yates的另一个版本使用JSoup
回答@Grab(group='org.jsoup', module='jsoup', version='1.7.3')
import org.jsoup.Jsoup
def (doc,files, dirs) = [Jsoup.connect('http://central.maven.org/maven2/com/bloidonia/groovy-stream/').get(),[],[]]
doc.select("pre > a").each{href ->
def filename = href.text()
filename.endsWith("/")?dirs.add(filename):files.add(filename)
}
println """DIRECTORIES :
${dirs.join('\n')}
FILES :
${files.join('\n')}
"""
答案 1 :(得分:3)
不,您需要对返回的HTML进行一些解析。
以此页面为例:http://central.maven.org/maven2/com/bloidonia/groovy-stream/
我们需要做类似的事情:
@Grab( 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' )
def url = 'http://central.maven.org/maven2/com/bloidonia/groovy-stream/'.toURL()
new XmlSlurper( new org.ccil.cowan.tagsoup.Parser() ).parseText( url.text )
.body
.pre
.a
.each { link ->
if( link.@href.text().endsWith( '/' ) ) {
println "FOLDER : ${link.text()}"
}
else {
println "FILE : ${link.text()}"
}
}
打印出来:
FOLDER : ../
FOLDER : 0.5.1/
FOLDER : 0.5.2/
FOLDER : 0.5.3/
FOLDER : 0.5.4/
FOLDER : 0.6/
FOLDER : 0.6.1/
FOLDER : 0.6.2/
FILE : maven-metadata.xml
FILE : maven-metadata.xml.md5
FILE : maven-metadata.xml.sha1
显然,您需要调整body.pre.a
位以匹配目录列表的网络服务器输出
答案 2 :(得分:0)
如果您想提供文件,我认为将FTP服务器放在那里要好得多。
除非您的HTTP服务器支持已知的文件服务协议,例如WebDAV,否则您将不得不跳过一些环节将其用作文件服务器。
您需要使用HTTP客户端,例如Groovy HttpBuilder。
当您向该URL发出请求时,您的HTTP服务器会返回响应。如果您启用了目录列表,那么大多数HTTP服务器将返回一个HTML页面,为您提供指向该目录中文件和子目录的链接。
您需要解析该HTML响应,可能使用一些正则表达式从中提取您想要的文件链接。
但是每个HTTP服务器都以自己的格式返回此类列表,因此您必须使其适应服务器使用的格式。
答案 3 :(得分:0)
使用https的Grooveek代码的expadnded版本并提供cookie以访问登录/密码后面的webdavs:
@Grab(group='org.jsoup', module='jsoup', version='1.7.3')
import org.jsoup.Jsoup
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
def nullTrustManager = [
checkClientTrusted: { chain, authType -> },
checkServerTrusted: { chain, authType -> },
getAcceptedIssuers: { null }
]
def nullHostnameVerifier = [
verify: { hostname, session -> true }
]
SSLContext sc = SSLContext.getInstance("SSL")
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[], null)
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier)
def (doc,files,dirs) =
[Jsoup.connect('https://webdav/address').cookie('JSESSIONID','XYZsessionid').get(),[],[]]
doc.select("[href]").each{href ->
def filename = href.text()
def path = href.attr('href')
path.endsWith("/")?dirs.add(filename):files.add(filename)
}
println """DIRECTORIES :
${dirs.join('\n')}
FILES :
${files.join('\n')}
"""