2008-12-07 3 views
3

Мне нужно получить файл в память в моем приложении из защищенного веб-сайта. У меня есть URL-адрес файла для захвата, но он не может решить проблему безопасности. Вот код из Cookbook samples page:Secured File загрузить в 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 (выберите любой файл изображения, который вы можете найти в сети), он работает отлично. Однако, если я выберу URL-адрес, который требует пользователя/пароль, не уходите.

Хорошо, сделайте немного больше работы над этим. Кажется, что метод аутентификатора делает работы, но круглым путем. При первом обращении к URL-адресу я получаю ответ 302 с указанием местоположения на сервере входа. Если я получаю доступ к этому местоположению с помощью набора Authenticator, тогда я получаю еще 302 с Cookie и место, установленное на исходный URL. Если я получаю доступ к оригиналу, загрузка выполняется правильно.

Итак, мне нужно немного подражать браузеру, но в итоге все это работает.

Создание этой вики-сообщества, чтобы другие могли добавлять другие методы.

Спасибо!

ответ

10

Если creds on 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

В зависимости от вида AUTH для сервера, вы могли бы поставить кредитки на самом 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