2008-12-07 8 views
3

J'ai besoin d'obtenir un fichier en mémoire dans mon application à partir d'un site Web sécurisé. J'ai l'URL du fichier à capturer, mais je n'arrive pas à résoudre le problème de sécurité. Voici le code de la Cookbook samples page:Téléchargement de fichier sécurisé dans Groovy

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

et voici ma « mémoire » version de la même fonction qui renvoie un tableau d'octets du contenu du fichier:

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() 
} 

Lorsque je tente cette contre un non garanti URL (choisissez n'importe quel fichier image que vous pouvez trouver sur le net), cela fonctionne très bien. Cependant, si je choisis une URL qui nécessite un utilisateur/mot de passe, ne partez pas.

Très bien, j'ai fait un peu plus de travail là-dessus. Il semble que la méthode Authenticator fonctionne, mais d'une manière ronde. La première fois que j'accède à l'URL, j'obtiens une réponse 302 avec un emplacement à un serveur de connexion. Si j'accède à cet emplacement avec un ensemble Authenticator, alors je reçois un autre 302 avec un cookie et l'emplacement est redéfini sur l'URL d'origine. Si j'accède alors à l'original, le téléchargement se déroule correctement. Donc, je dois imiter un navigateur un peu, mais finalement tout cela fonctionne. En faire un wiki communautaire, afin que d'autres puissent ajouter d'autres méthodes.

Merci!

Répondre

10

Si les URL sur l'URL ne fonctionnent pas, vous pouvez l'utiliser. Cela fonctionne pour l'authentification de base.

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 
} 

Espérons que ça aide!

+0

Je suis juste tombé sur ceci aujourd'hui, et cela m'a vraiment aidé. Merci. – Robert

+0

Je vais marquer cela comme la meilleure réponse, car ce n'est pas juste un changement d'URL facile. Cela n'a pas fonctionné pour moi plus pour la configuration de SiteMinder de ma compagnie que pour la solution étant incomplète. – billjamesdev

3

En fonction du type de auth pour le serveur, vous pouvez mettre les creds sur l'url lui-même:

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

Si vous n'êtes pas passer par un proxy, vous ne voulez pas faire la procuration choses dont vous parlez. Ce n'est pas applicable.

+0

Je vais essayer cet après-midi, merci! – billjamesdev

+1

Ok, je l'ai essayé, pas d'aller. La sécurité n'est pas si basique, je suppose. Je pense que le serveur de connexion place les informations dans un cookie ou dans la session de l'application eRoom à laquelle j'accède. – billjamesdev

+0

Ne fonctionne pas car 'URL.openConnection()' n'effectue aucune analyse userInfo. – OrangeDog