HTTP-Java上某些图像的FileNotFoundException

HTTP-Java上某些图像的FileNotFoundException,java,http,filenotfoundexception,java-io,Java,Http,Filenotfoundexception,Java Io,在通过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-M

在通过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相当的
java.net
吗?

您使用的是Sun/Oracle JDK还是Open JDK?请转到控制台并在此处插入“java-version”的输出,好吗?

我在
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 ~~~

自从做出上述改变以来,这个问题就再也没有发生过。我唯一能解释的是浏览器一定是在缓存图像,或者是间歇性问题。无论如何,现在有了额外的日志记录,以后任何问题都应该很容易解决。

您从哪里获得imageUrl?服务器上文件的路径从来不是您第一次想到的方式…从平面文件中的文章列表中-同一服务器(和目录)上的其他图像可以正常工作。
Java(TM)SE运行时环境(build 1.6.0_17-b04)Java热点(TM)64位服务器VM(build 14.3-b01,混合模式)
哪一行是“460”?在uk.co.example.ExampleClass.importFileFromUrl(ExampleClass.java:460)中,它是提供的方法中带有
getInputStream()
的行。它还没有足够的信息。请尝试使用Apache HTTP客户端:?试着用它来获得图像。该类可以为您提供HTTP请求/响应头,以澄清正在发生的事情。请尝试返回给我们。也许你可以在你的代码中使用它,并解决这个问题。
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)