Toolkit.getImage() 的正确路径是什么?

3
我需要在我的JSF web应用程序中上传图像文件并生成缩略图。原始图像存储在服务器上的/home/myname/tomcat/webapps/uploads,而缩略图存储在/home/myname/tomcat/webapps/uploads/thumbs中。我使用了从philreeve.com复制的缩略图生成器类。
我已成功上传文件,并得到了BalusC的帮助。但是,使用Toolkit.getImage()时,我无法访问该图像。
我使用了上传文件的绝对路径,如下所示:
inFilename = file.getAbsolutePath();

缩略图生成器中的相关代码如下:
public static String createThumbnail(String inFilename, String outFilename, int largestDimension) {
    ...
    Image inImage = Toolkit.getDefaultToolkit().getImage(inFilename);
    if (inImage.getWidth(null) == -1 || inImage.getHeight(null) == -1) {
        return "Error loading file: \"" + new File(inFilename).getAbsolutePath() + "\"";
    }
    ...
}

由于我已经使用了绝对路径,我不明白为什么它不能工作。我还尝试了以下inFilename的值,但始终收到“加载文件出错”的消息。

  • /home/myname/tomcat/webapps/uploads/filename.ext
  • /uploads/filename.ext

但是我确实检查过目录,图片确实在那里。(我使用/home/myname/tomcat/webapps/uploads/filename.ext上传,它可以工作。)该目录中图像的正确路径是什么?谢谢。

更新

我通过使用以下代码使其工作:

Image inImage = ImageIO.read(new File(inFilename));

我仍然不理解为什么Toolkit.getImage()不起作用。
2个回答

2

确定它是JPEG文件吗?使用图像查看器确保在上传期间文件未发生损坏(或者一开始就是图像文件)。

此外,使用new File(inFilename).exists()确保路径正确。我还建议在错误消息中打印new File(inFilename).getAbsolutePath(),因为相对路径可能会给你带来麻烦。

话虽如此,代码的其余部分看起来是正确的。


谢谢回复。.jpg只是一个例子,对于误解我很抱歉。我实际上是在获取文件的后缀名。我尝试在浏览器中查看图像:http://***:8082/uploads/filename.jpg,它可以正确显示。我已经修改了代码,感谢您的帮助。我将继续解决这个问题,但我有一种感觉getAbsolutePath()会派上用场。 :) - Jill
你好,我已经更新了我的代码和原始帖子。现在我确定文件存在,因为我正在使用刚成功上传的文件的绝对路径。但即使如此也不起作用。如果您有任何想法,我会很感激听到它们。谢谢 :) - Jill
2
我刚刚使用了ImageIO.read()而不是Tookit.getImage(),它起作用了。感谢您提供绝对路径建议,老实说,凭借我生疏的Java技能,我自己想不到这一点。硬编码位置会很丑陋。感谢您的时间。 :) - Jill
从这段代码开始:http://www.roseindia.net/java/example/java/swing/graphics2D/display-image-using-toolkit.shtml - Aaron Digulla
谢谢您的建议!我注意到我在 ImageIO.read()Toolkit.getImage() 中使用完全相同的文件,因此我的(猜测)是,Toolkit.getImage() 只适用于 applet 类型? :/ - Jill
显示剩余2条评论

2
问题在于Toolkit.getImage()并不会立即返回图像。这个问题在这个bug报告中有很好的描述,其中的相关部分如下所示:

这不是一个错误。提交者没有正确地使用异步图像API。他假定getImage将所有图像位加载到内存中。然而,实际的位加载不会发生,直到调用Component.prepareImage或Graphics.drawImage的时候。此外,在Image完全加载之前,这两个函数就已经返回了。开发人员需要安装ImageObserver来监听通知,以确定Image已经完全加载。一旦他们收到了这个通知,他们就可以重新绘制Image。

我发现这个问题的答案可以很好地解决它: Image image = new ImageIcon(this.getClass().getResource("/images/bell-icon16.png")).getImage();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接