0

在通过 HTTP 处理图像列表的类中,一个图像会引发 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

我在调用周围添加了一个 try/catch 块getInputStream()

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 回答