Groovy中的安全文件下载

时间:2008-12-07 06:36:33

标签: file groovy download

我需要从安全的Web位置将文件存入我的应用程序的内存中。我有要捕获的文件的URL,但似乎无法解决安全问题。以下是Cookbook samples page

中的代码
def download(address)
{
    def file = new FileOutputStream(address.tokenize("/")[-1])
    def out = new BufferedOutputStream(file)
    out << new URL(address).openStream()
    out.close()
}

这是同一个函数的“内存”版本,它应该返回文件内容的字节数组:

def downloadIntoMem(address)
{  // btw, how frickin powerful is Groovy to do this in 3 lines (or less)
        def out = new ByteArrayOutputStream()
        out << new URL(address).openStream()
        out.toByteArray()
}

当我针对不安全的URL尝试此操作时(选择您可以在网上找到的任何图像文件),它可以正常工作。但是,如果我选择需要用户/密码的URL,则不要去。

好的,在这方面做了一些工作。似乎认证者方法确实工作,但是以一种全面的方式。第一次访问URL时,我得到一个302响应,其中包含一个登录服务器的位置。如果我使用Authenticator集访问该位置,那么我将获得另一个带有Cookie的302,并将该位置设置回原始URL。如果我然后访问原始文件,则下载正确。

所以,我必须模仿一下浏览器,但最终一切都有效。

将此设为社区维基,以便其他人可以添加其他方法。

谢谢!

2 个答案:

答案 0 :(得分:10)

如果网址上的信用不起作用,您可以使用此功能。它适用于基本身份验证。

new File(localPath).withOutputStream { out ->
    def url = new URL(remoteUrl).openConnection()
    def remoteAuth = "Basic " + "${user}:${passwd}".bytes.encodeBase64()
    url.setRequestProperty("Authorization", remoteAuth);
    out << url.inputStream
}

希望有所帮助!

答案 1 :(得分:3)

根据服务器的身份验证类型,您可以将信用卡放在网址上:

def address = "http://admin:sekr1t@myhost.com"
def url = new URL(address)
assert "admin:sekr1t" == url.userInfo

如果您没有通过代理,则不希望执行您所指的代理内容。它不适用。