【问题标题】:how to save a base64 as image in java server faces project如何在java server faces项目中将base64保存为图像
【发布时间】:2012-12-23 12:54:42
【问题描述】:

我正在为学校做一个项目。项目主题是 T 恤设计。我正在使用 jsf 和 primefaces。但是我不太了解jsf和primefaces。我想将 html 中的 base64 保存为 jsf 项目中的图像。但是当我尝试跟踪函数时,NullPointerException。此函数在 Servlet 中调用。这个 Servlet 抓取了一个 base64。

public static void save(String dataURL){

line85: ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
    ServletContext servletContext = (ServletContext) external.getContext();
    String filename = servletContext.getRealPath("cloud.png");
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] decodedBytes;
    try {

        decodedBytes = decoder.decodeBuffer(dataURL.split("data:image/(png|jpg);base64,")[1]);
        BufferedImage imag=ImageIO.read(new ByteArrayInputStream(decodedBytes));
        ImageIO.write(imag, "png", new File(filename));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}




    23.Ara.2012 17:48:20 org.apache.catalina.core.StandardWrapperValve invoke
     SEVERE: Servlet.service() for servlet [org.soft.tshirt.servlets.DesignServlet] in context              with path [/Tshirt] threw exception
    java.lang.NullPointerException
at org.soft.tshirt.beans.ImageBean.save(ImageBean.java:85)
at org.soft.tshirt.servlets.DesignServlet.processRequest(DesignServlet.java:102)
at org.soft.tshirt.servlets.DesignServlet.doPost(DesignServlet.java:76)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at       
   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

【问题讨论】:

    标签: servlets jsf-2 nullpointerexception servlet-3.0 facescontext


    【解决方案1】:

    FacesContext 的当前实例仅在 HTTP 请求线程中可用,该线程通过负责创建 FacesContextFacesServlet 提供服务。换句话说,只有当请求 URL 与 FacesServlet 的 URL 模式匹配时。换句话说,只有 JSF 页面、JSF 托管 bean(因此 不是 支持 bean,您可以像这里发生的那样实例化自己!)以及所有其他 JSF 工件,如事件/阶段侦听器、UI 组件等让他们可以使用FacesContext 的当前实例。

    在一个任意的本地 HTTP servlet 中,FacesContext 根本不可用,原因很简单,FacesServlet 没有被事先调用。所以它上面的getCurrentInstance() 方法将返回null。你知道,尝试访问/调用null 上的任何字段/方法将导致NullPointerExceptionSee also its javadoc.

    为了达到获取ServletContext的唯一目的,只需在servlet内部调用继承的GenericServlet#getServletContext()方法即可。

    protected void doPost(...) {
        String filename = getServletContext().getRealPath("cloud.png");
        // ...
    }
    

    将该信息传递给负责创建文件的方法。您可能希望将该代码提取到不同的类中,该类在您的 servlet 和支持 bean 之间重用。


    与具体问题无关,将文件写入扩展的 WAR 文件夹确实是一种不好的做法,原因在此答案中提到:Uploaded image only available after refreshing the page

    【讨论】:

    • 谢谢。我正在尝试你现在说的。此外,在 Servlet 中调用函数为 ImageBean.save(dataURL)。 ImageBean 是一个 ManagedBean。保存函数是ImageBean定义的。
    • 在这种情况下,它根本不是托管 bean。您没有使用由 JSF 实例化并放置在 EL #{} 范围内的那个。支持 bean 类只是被“滥用”为实用程序类。您是否了解FacesContext 的可用方式和时间?
    • 我尝试将base 64直接保存在servlet getServletContext().getRealPath("cloud.png")中,但又出现了nullpointerexception。 Servlet 使用 jquery.post() 从 html5 中获取 base64,因此我无法在 xhtml (jsf) 中设计图像。
    • 现在null 到底是什么(顺便说一下,你明白NullPointerException 的真正含义吗?你的评论中似乎没有在你尝试的时候确定null 到底是什么对象访问它)
    • 错误:servlet calisti 23.Ara.2012 19:33:10 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [org.soft.tshirt.servlets.DesignServlet] in context with path [/Tshirt] threw exception java.lang.NullPointerException at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125) at org.soft.tshirt.servlets.DesignServlet.processRequest(DesignServlet.java:114) at org.soft.tshirt.servlets.DesignServlet.doPost(DesignServlet.java:84) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at ....
    猜你喜欢
    • 2023-03-11
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2013-01-25
    • 2012-04-07
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多