0

HTTPを介して画像のリストを処理するクラスでは、1つの画像がFNFEをスローします。最初の仮定は、ファイルが宛先に存在しないということですが、存在します。イメージはブラウザでアクセスでき、同じマシンで実行されている別のJavaアプリケーション(私が作成したコマンドラインテストケース)を介してアクセスできますか?

スタックトレースは次のとおりです。

23-Apr-2012 17:23:57 uk.co.example.ExampleClass setImageUrl
WARNING: Exception setting image Url to http://images.example.co.uk/FPA-Midlands/MLO100316_01.jpg
java.io.FileNotFoundException: http://images.example.co.uk/FPA-Midlands/MLO100316_01.jpg
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1311)
    at uk.co.example.ExampleClass.importFileFromUrl(ExampleClass.java:460)

これは元のコードです:

private String importFileFromUrl(String imageUrl) throws IOException, CMException {
    InputStream is = null;
    String name = null;
    if (imageUrl != null && imageUrl.startsWith("http")) {
        URL url = new URL(imageUrl);
        URLConnection urlc = url.openConnection();
        is = urlc.getInputStream();
        name = url.getFile();
        name = name.substring(name.lastIndexOf('/') + 1);
    } else if (StringUtils.isNotBlank(imageUrl)){
        File f = new File (imageUrl);
        name = f.getName();
        is = new FileInputStream(f);
    }
    if (name != null && is != null) {
        importFile(name, is);
    }
    return name;
}

クラスがスタックに表示されるため、sun.net.www.protocol.http.HttpURLConnectionこれがクラスローダーの問題であるかどうか疑問に思いました。java.netそのパッケージを明示的にインポートしていません-同等のものを使用するべきではありませんか?

4

2 に答える 2

1

Sun/Oracle JDK または Open JDK を使用していますか? コンソールに移動して、「java -version」の出力をここに挿入していただけますか?

于 2012-04-24T09:35:45.083 に答える
0

getInputStream()呼び出しの周りに try/catch ブロックを追加しました。

try {
    is = urlc.getInputStream();
} catch(FileNotFoundException fnfe){
    is = ((HttpURLConnection) urlc).getErrorStream();
    LOG.log(Level.WARNING, "Exception streaming image: \n" + IOUtils.toString(is));
    throw fnfe;
}

ログ出力から、サーバーが 404 応答コードで応答していることは明らかです。

25-Apr-2012 10:46:43 uk.co.example.ExampleClass importFileFromUrl
WARNING: Exception streaming image: 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
~~~ snip ~~~
<h2>HTTP Error 404 - File or directory not found.<br>Internet Information Services (IIS)</h2>
~~~ snip ~~~

以前はこのgetErrorStream()方法を知りませんでした。ページの応答はすべてgetInputStream(). 私がわかりにくい/直感的でない他の領域は、HttpURLConnection クラスが HTTP 404 応答に対して FNFE をスローすることです。

他のエラーの場合、応答コードはより明白です。

13-Apr-2012 15:40:43 uk.co.example.ExampleClass setImageUrl
WARNING: Exception setting property image Url to http://images.example.co.uk/FPA-Midlands/MLO100316_01.jpg
java.io.IOException: Server returned HTTP response code: 403 for URL: http://images.example.co.uk/FPA-Midlands/MLO100316_01.jpg
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)

上記の変更を行って以来、問題は再発していません。私が説明できる唯一の方法は、ブラウザが画像をキャッシュしていたに違いないか、それが断続的な問題だったということです. いずれにせよ、追加のログが利用できるようになったので、将来どんな問題も簡単に解決できるはずです。

于 2012-04-25T10:36:56.560 に答える