【问题标题】:Looking for image in HDD rather in context在 HDD 中而不是在上下文中寻找图像
【发布时间】:2011-12-12 18:14:17
【问题描述】:

我有多模块项目

Project
  |--src
      |-JavaFile.java

Web-Project
  |-Web-Content
    |-images
    |   |-logo.PNG
    |-pages
    |-WEB-INF
  1. 常规 java 模块 - 包含所有 java 文件的 src
  2. 动态网络项目模块 - 包含所有与网络相关的东西

最终常规的 java 模块在 lib 文件夹中的动态 web 模块中作为 jar 文件出现

问题

编译后的 java 文件在 c:\ibm\sdp\server completepath\logo.png 中而不是在上下文中查找图像文件。文件在 iText 的 java 文件中定义如下:

Image logo = Image.getInstance("/images/logo.PNG");

请建议我如何更改我的 java 文件以引用图像。我不允许更改我的项目结构。

【问题讨论】:

    标签: url jsf itext contextpath


    【解决方案1】:

    为此,您需要使用ServletContext#getResource(),或者更好的是getResourceAsStream()。它返回 Web 内容中资源的 URLInputStream

    InputStream input = getServletContext().getResourceAsStream("/images/logo.PNG");
    // ...
    

    这样,您就不必依赖于 Web 应用的部署位置(以及如何部署!)。依赖绝对磁盘文件系统路径只会导致可移植性问题。

    另见:


    更新:根据 cmets,您似乎正在使用 iText(您应该在问题中进一步澄清,我对其进行了编辑)。然后您可以使用Image#getInstance() 方法,该方法采用URL

    URL url = getServletContext().getResource("/images/logo.PNG");
    Image image = Image.getInstance(url);
    // ...
    

    更新 2:根据 cmets,您原来是坐在 JSF 上下文中(您也应该在问题中澄清这一点)。您应该使用ExternalContext#getResource() 来获取URL

    URL url = FacesContext.getCurrentInstance().getExternalContext().getResource("/images/logo.PNG");
    Image image = Image.getInstance(url);
    // ...
    

    【讨论】:

    • 问题:我需要绝对 URL 或绝对文件名 -> 字符串而不是流。我正在使用 com.itextpdf.text.Image;非常感谢您的友好回复。我正在使用面孔,因此我必须使用 InputStream input = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/images/logo.PNG");图片标志 = Image.getInstance(input);
    • 我没有通过 FacesContext 直接访问 Servlet 上下文。现在我得到 NullPointerException。 InputStream 输入 = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("../images/logo.PNG");字符串 str=input.toString();字节[] b=str.getBytes();图片标志 = Image.getInstance(b);
    • 我的文件名错误...现在抛出 java.io.IOException: The byte array is not a identify imageformat.
    • 您使用的是 JSF?您也应该提到这一点:) 我会更新答案。顺便说一句,您的错误是因为您在InputStream 上做了一个无意义的toString(),而不是使用read() 阅读它。
    • 在搜索了如何从 inputStream 更改为字节数组之后,我能够解决问题。非常感谢 BalusC,你总是一个很大的帮助。
    猜你喜欢
    • 2013-10-20
    • 2011-07-23
    • 2011-02-21
    • 2021-10-26
    • 2017-04-12
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多