3

セキュリティで保護された Web の場所からアプリのメモリにファイルを取得する必要があります。キャプチャするファイルの 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 応答が返されます。オーセンティケーターを設定してその場所にアクセスすると、別の 302 が返され、Cookie と場所が元の URL に設定されます。その後、オリジナルにアクセスすると、ダウンロードは正しく行われます。

そのため、ブラウザを少し模倣する必要がありますが、最終的にはすべて機能します。

これをコミュニティ wiki にして、他の人が他の方法を追加できるようにします。

ありがとう!

4

2 に答える 2

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
}

それが役立つことを願っています!

于 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 に答える