Защищенная загрузка файлов в Groovy - PullRequest
3 голосов
/ 07 декабря 2008

Мне нужно получить файл в память в моем приложении из защищенного веб-сайта. У меня есть URL-адрес файла для захвата, но, похоже, не удалось решить проблему безопасности. Вот код со страницы образцов поваренной книги :

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, то я получаю еще 302 с Cookie и местоположение, возвращаемое к исходному URL. Если я получу доступ к оригиналу, загрузка произойдет правильно.

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

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

Спасибо!

Ответы [ 2 ]

10 голосов
/ 28 февраля 2011

Если кредиты на 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 голосов
/ 07 декабря 2008

В зависимости от типа аутентификации для сервера, вы можете поставить кредиты на самом URL:

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

Если вы не проходите через прокси, вы не хотите делать то, о чем вы говорите. Это не применимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...