2013-07-16 45 views
0

我的意思是把它作为注释发布在this question,但我没有足够的代表,但我没有看到别的方法,只是提出了一个新问题(尽管看起来有点多余)。从JSF bean传递图像到Applet

无论如何,我试图解决skuntsel写道,但反向:我编码的图像,并从豆到JavaScript方法发送它(我使用ICEfaces的,所以我把它叫做这样JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall))。我在Applet中获得了编码的字符串,但是当我尝试解码它时,没有任何反应,它后面的代码无法访问。

我错过了什么吗?提前致谢!

编辑:这里是我使用的代码。

在豆:(通过点击一个按钮触发方法)

BufferedImage originalImage = acquireImage(); 
byte[] imageInByte = null; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try { 
     ImageIO.write(originalImage, "png", baos); 
     baos.flush(); 
     imageInByte = baos.toByteArray(); 
     baos.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
    } 

String imageAsString = Base64.encodeBase64String(imageInByte); 
JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall); 

在Javascript中:

function getEncodedImage(image){ 
     var applet = document.getElementById("Applet"); 
     applet.decodeImage(image); 
} 

在小程序:

public void decodeImage(String image) { 
    System.out.println(image); //works 
    byte[] imageByteArray = Base64.decodeBase64(image); 
    System.out.println("something"); //doesn't print anything 
    InputStream is = new ByteArrayInputStream(imageByteArray); 

    try { 
     BufferedImage img = ImageIO.read(is); 
     ImageIO.write(img, "png", new File("D:/image.png")); 
      is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
      } 

} 
+0

你的问题还不清楚。扩大上下文并将代码添加到问题中。而且,是的,只需在您提到的答案中恢复逻辑即可。 – skuntsel

+0

添加了代码:) – v30

回答

0

唯一可疑的部分是JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall);:我没有看到任何functionCall的定义。尽管如此,由"getEncodedImage(" + image + ")"取代,它应该工作。

我还没有和ICEfaces一起就JavascriptContext#addJavascriptCall()的工作方式进行任何新的说明,但有一个标准的JSF解决方案:有一个隐藏的输入,其中包含编码的字符串在操作方法中设置并通过AJAX添加JS回调。

也就是说,豆部分:

private String imageAsString;//getter + setter 
public void encodeImage() { 
    ... 
    this.imageAsString = Base64.encodeBase64String(imageInByte); 
} 

和视图:

<script> 
    function update(data){ 
     if(data.status == "success") { 
      var applet = document.getElementById("Applet"); 
      var image = document.getElementById("form:image").value; 
      applet.decodeImage(image); 
     } 
    } 
</script> 
... 
<h:form id="form"> 
    ... 
    <h:inputHidden id="image" value="#{bean.imageAsString}" /> 
    <h:commandButton value="Submit" action="#{bean.encodeImage}"> 
     <f:ajax render="image" onevent="update" /> 
    </h:commandButton> 
</h:form> 
+0

我试过隐藏的输入,结果是一样的,这就是我选择'addJavascriptCall()'的原因。 functionCall是构建javascript调用的函数的结果,结果将类似于'getEncodedImage(imageAsString);'(其中imageAsString是实际编码的图像)。无论如何,我被告知使用不同的方法,但我仍然好奇为什么这不起作用.... – v30