Groovy-从http URL进行文件处理

Groovy-从http URL进行文件处理,url,groovy,html-parsing,Url,Groovy,Html Parsing,我们其中一台服务器中的文件可以通过http访问。因此,当我们打开类似于以下内容的url时,我们会得到该位置的文件/目录列表: http://mytestserver/files/ 从这个列表中,我只需要选择那些与正则表达式格式匹配的文件 如果这是磁盘中的一个位置,我可以使用eachFileMatch方法过滤我需要的文件 有人能帮助我如何从http URL执行此操作吗?没有,您需要对返回的HTML进行一些解析 以本页为例: 我们需要做一些类似的事情: @Grab( 'org.ccil.cowan

我们其中一台服务器中的文件可以通过http访问。因此,当我们打开类似于以下内容的url时,我们会得到该位置的文件/目录列表:

http://mytestserver/files/
从这个列表中,我只需要选择那些与正则表达式格式匹配的文件

如果这是磁盘中的一个位置,我可以使用eachFileMatch方法过滤我需要的文件


有人能帮助我如何从http URL执行此操作吗?

没有,您需要对返回的HTML进行一些解析

以本页为例:

我们需要做一些类似的事情:

@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
位,以匹配目录列表的Web服务器输出

如果您想提供文件,我认为在那里放置FTP服务器会更好

除非您的HTTP服务器支持一个已知的文件服务协议,例如,否则您将不得不跳过一些障碍,将其用作文件服务器

您需要使用HTTP客户机,如Groovy

当您向该URL发出请求时,HTTP服务器将返回响应。如果启用了目录列表,那么大多数HTTP服务器将返回一个HTML页面,为您提供指向该目录中的文件和子目录的链接

您需要解析该HTML响应,可能需要使用一些正则表达式从中提取所需的文件链接


但是每个HTTP服务器都会以自己的格式返回这些列表,因此您必须根据服务器使用的格式对其进行调整。

另一个版本的@tim_yates Answer使用


使用https扩展版本的Grooveek代码,并提供cookie以在登录/密码后访问WebDAV:

@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')}
"""
@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')}
"""