[컴][웹] javascript 의 binary data 를 java applet 으로 넘기기

passing binary data from javascript to java applet



Blob to byte[]


javascript 에서 blob 으로 되어 있는 부분을 java applet 에서 file 로 저장하는 방법을 찾다가 ref. 1 에서 해결책을 제시해 줬다.

방법을 정리하면 FileReader.readAsDataURL() 로 읽어드리고 이 녀석을 applet 으로 넘겨서 이것을 DatatypeConverter.parseBase64Binary() 를 이용해서 byte[] 로 변환하는 것이다.

아래 대략적인 code 를 작성 해 놨다.

주의할 점은 readAsDataURL() 로 읽은 부분의 앞부분에 "MIME type;encoding" 이 있어서 이부분을 제거해 주고 넘겨야 한다. 자세한 사항은 code 를 참고하자.


responseType

xhr.responseType = 'blob';
어쩌다가 저 부분을 빼고 실행을 하니, 받아온 data 를 다르게 처리했다. XMLHttpRequest - Web API Interfaces | MDN 에 따르면 default 는 "text" 인 듯 하다. 필자의 경우는 300kb 이미지 였는데, 500kb 의 length 가 보이기도 했다. 그래서 binary file 을 처리할 때는 responseType 을 잘 set 해줘야 한다.


Codes



// TiddlySaver.java
public int saveFile(final String filename, String myBase64Code) {
        byte[] data = DatatypeConverter.parseBase64Binary(myBase64Code);
        ...



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en-US">
  <head>
    <title>Math Applet Page - JavaScript to Java LiveConnect</title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <script src="js/jquery-1.8.3.js"></script>
    <script src="js/jQuery.twFile.js"></script>


    <script id="worker1" type="javascript/worker">
    // This script won't be parsed by JS engines
    // because its type is javascript/worker.
    self.onmessage = function(e) {
      
      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://localhost:8080/resources/testflower.jpg', true);
      xhr.responseType = 'blob';

      xhr.onload = function(e) {
        if (this.status == 200) {
          // Note: .response instead of .responseText
          var blob = new Blob([this.response], {type: 'image/png'});
          self.postMessage(blob);
          
        }
      };

      xhr.send();
      
    };
    // Rest of your worker code goes here.
  </script>



    <script language="javascript">
    function enterNums(){

            ////////////////////////////
            // Set FileReader
            var myBlob
            var reader = new FileReader();

            reader.onload = function(e) {
              // to get rid of MIME
              var r = reader.result;
              var data = r.substr(r.indexOf(',') + 1)
              TiddlySaver.saveFile("c:\\temp\\_testpic.jpg", data);
            }


            // Make a worker
            var blob = new Blob([document.querySelector('#worker1').textContent]);
            var worker1 = new Worker(window.URL.createObjectURL(blob));

            worker1.onmessage = function(e){
              myBlob = e.data;
              reader.readAsDataURL(myBlob);

            };
            
            worker1.postMessage(""); // Start the worker.

    }


    </script>

  </head>
  <body>
    <noscript>A browser with JavaScript enabled is required for this page to operate properly.</noscript>
    <script src="https://www.java.com/js/deployJava.js"></script>
    <script>
        <!-- applet id can be used to get a reference to the applet object -->
        var attributes = { id:'TiddlySaver', code:'jstojava.TiddlySaver', width:1, height:1} ;
        var parameters = {jnlp_href: 'tiddlySaver.jnlp'} ;
        deployJava.runApplet(attributes, parameters, '1.7');
    </script>


    <p><a href="javascript:enterNums();">Launch Example</a></p>
  </body>
</html>



References

  1. image - Javascript: Blob object to base64 - Stack Overflow


댓글 없음:

댓글 쓰기