2013-07-16 42 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