【问题标题】:Cannot find the image in the java dynamic web projectjava动态web项目中找不到图片
【发布时间】:2012-05-14 20:55:20
【问题描述】:

我有以下问题:

我创建了应该绘制动态图的 servlet。在绘图过程中,它应该从另一个目录中获取图片并将其绘制到另一个图像上。一切都应该正常:

try {
            BufferedImage temp = ImageIO.read(new File("image/arrow.png"));
            tempIm = temp.getScaledInstance(55, 55, Image.SCALE_SMOOTH);
        } catch (IOException e) {

            e.printStackTrace();

        }

但它会打印以下内容:

SEVERE: javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(ImageIO.java:1275) at CertificateDraw.doGet(CertificateDraw.java:36)

我尝试以所有可能的方式更改 File 对象的路径,即使图像的一部分仍发送到浏览器,它也会出现相同的问题。所以问题出在 ImageIO.read 部分 - 我怎样才能找到它不加载图像的原因?!

我在 Eclipse 中工作 - servlet 在 src 文件夹中。图片位于 rot 目录“WebContent”下的“image”文件夹中。

【问题讨论】:

    标签: java jakarta-ee servlets


    【解决方案1】:

    java.io.File 中的相对路径是相对于当前工作目录 (CWD)。这是在发出命令以启动 Java 运行时环境(在您的情况下为网络服务器)时当前打开的文件夹。在 Eclipse 中启动服务器时,这通常是项目的/bin 文件夹。你可以通过打印new File(".").getAbsolutePath()来计算。

    但您根本不应该依赖File 中的相对路径。 CWD 无法从代码内部控制。

    由于它已经在 webcontent 文件夹中,只需通过 ServletContext#getResourceAsStream() 获取即可。

    InputStream input = getServletContext().getResourceAsStream("/image/arrow.png");
    BufferedImage image = ImageIO.read(input);
    // ...
    

    请注意,getServletContext() 继承自 GenericServlet 类,HttpServlet 扩展自该类,因此您无需自己提供该方法。

    【讨论】:

    • 但是你能解释一下这个概念吗?什么是 CWD?不应该是部署在网络服务器中的文件吗? servlet 仅在调用时处理请求 - 这意味着 File 类在部署之前正在寻找资源? + getResource() 如何找到相同的资源?我是否也应该对所有类型的片段做同样的事情——不仅仅是图片? - jsp片段呢 - 如果它们不是直接在根目录下而是在某个子文件夹下,它们是如何加载的?
    • CWD 是“当前工作目录”。它是 JRE/JVM 启动时当前打开的本地磁盘文件系统文件夹。作为练习,创建一个打印new File(".").getAbsolutePath() 的简单java 类。编译它并将其保存在固定位置,然后在不同文件夹中的命令提示符下运行它。例如。 windows 文件夹、程序文件、文档等。您会看到它每次都会打印当前打开的文件夹。 java.io.File 仅适用于本地磁盘文件系统,了解应用程序运行的上下文(例如 Java EE webapp)
    • 换句话说,永远不要在 web 应用程序中将File 与相对路径一起使用。另见stackoverflow.com/questions/2308188/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多