2008-12-07 110 views
3

我需要从我的应用程序中从安全的Web位置获取文件到内存中。我有要捕获的文件的URL,但似乎无法解决安全问题。下面是来自Cookbook samples page代码:Groovy安全文件下载

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(选择你可以在网上找到的任何图像文件),它工作得很好。但是,如果我选择需要用户/密码的网址,则不可以。

好的,在这方面做了更多的工作。看起来Authenticator方法确实工作,但在一个圆满的方式。我第一次访问这个URL时,我得到了一个302位置的登录服务器响应。如果我使用身份验证器设置访问该位置,那么我会获得另一个具有Cookie的302,并且该位置将恢复为原始网址。如果我然后访问原件,则正确下载。

所以,我不得不模仿一个浏览器,但最终它的一切工作。

使这个社区维基,所以其他人可以添加其他方法。

谢谢!

回答

10

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

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 
} 

希望帮助!

3

根据一种身份验证服务器的,你可以把vim的信任状的URL本身:

def address = "http://admin:[email protected]" 
def url = new URL(address) 
assert "admin:sekr1t" == url.userInfo 

如果你不通过代理去,你不想做代理你所指的东西。这不适用。

+0

今天下午我会试一试,谢谢! – billjamesdev 2008-12-07 15:11:52

+1

好吧,我试过了,不行。我猜想安全性不是那么基本。我认为登录服务器会将信息放入Cookie或正在访问的eRoom应用程序的会话中。 – billjamesdev 2008-12-08 04:06:42