0

我打算将此作为对此问题的评论发布,但我没有足够的代表,除了提出一个新问题之外我没有其他办法(尽管它似乎有点多余)。

无论如何,我尝试了skuntsel写的解决方案,但反过来:我对图像进行编码并将其从 bean 发送到 javascript 方法(我使用的是 icefaces,所以我这样称呼它JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall))。我在 Applet 中得到了编码的字符串,但是当我尝试解码它时,什么也没有发生,它后面的代码无法访问。

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

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

在 bean 中:(通过按钮单击触发的方法)

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();
           }

}
4

1 回答 1

0

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

我没有与 ICEfaces 合作过如何JavascriptContext#addJavascriptCall()工作,但有一个标准的 JSF 解决方案:有一个隐藏的输入,其中包含在操作方法中设置的编码字符串,并通过 AJAX 添加一个 JS 回调。

即bean部分:

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>
于 2013-07-17T07:54:32.403 回答