3

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

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,那就不行了。

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

所以,我必须稍微模仿一下浏览器,但最终一切正常。

将此作为社区 wiki,以便其他人可以添加其他方法。

谢谢!

4

2 回答 2

10

如果 url 上的 creds 不起作用,您可以使用它。它适用于基本身份验证。

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
}

希望有帮助!

于 2011-02-28T01:48:08.947 回答
3

根据服务器的身份验证类型,您可以将凭据放在 url 本身上:

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

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

于 2008-12-07T08:52:24.997 回答