2014-07-24 4 views
1

저는 Cordova 3.3 용 플러그인을 개발 중입니다.TypedArray를 Cordova 플러그인 매개 변수로 사용

내 자바 스크립트 부분에서 나는 uInt8Array로 저장된 PDF 파일을 다운로드 중입니다.

download: function () { 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', 'url/to/pdf', true); 
     xhr.responseType = 'arraybuffer'; 
     xhr.setRequestHeader('Accept', 'application/pdf'); 

     xhr.onload = function(e) { 
      var uInt8Array = new Uint8Array(this.response); 

      window.plugins.filedownloader.saveFile(
       uInt8Array, 
       "Downloads", 
       function (response) { 
        console.log("success"); 
       }, 
       function (response) { 
        console.log("failure"); 
       } 
      ); 
     }; 

     xhr.send(); 
    }, 

필자는 내 cordova 플러그인의 저장 방법에 uInt8Array를 적용합니다. 내 플러그인의 자바 스크립트 부분은 다음과 같습니다

public PluginResult execute(JSONArray args) { 
       PluginResult result = new PluginResult(PluginResult.Status.OK, "blub"); 
       log("saveFile"); 

       try{ 
        JSONObject dataValues = args.getJSONObject(0); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       return result; 
      } 

내 문제가하는 TypedArray 더 배열이 더 이상 없다는 것을, 지금 :

var exec = require('cordova/exec'); 

function FileDownloader() { 
}; 

FileDownloader.prototype = { 
    login: function (loginUrl, params, username, password, successCallback, failureCallback) { 
     exec(successCallback, failureCallback, "FileDownloader", "doLogin", [ loginUrl, params, username, password ]); 
    }, 

    getHtmlPage: function (url, successCallback, failureCallback) { 
     exec(successCallback, failureCallback, "FileDownloader", "getHtmlPage", [ url ]); 
    }, 

    downloadAndSaveFile: function (url, saveFolder, successCallback, failureCallback) { 
     exec(successCallback, failureCallback, "FileDownloader", "downloadAndSaveFile", [ url, saveFolder ]); 
    }, 

    saveFile: function (data, saveFolder, successCallback, failureCallback) { 
     exec(successCallback, failureCallback, "FileDownloader", "saveFile", [ data, saveFolder ]); 
    } 
}; 

FileDownloader.install = function() { 
    if (!window.plugins) { 
     window.plugins = {} 
    } 

    window.plugins.filedownloader = new FileDownloader(); 
    return window.plugins.filedownloader; 
}; 

cordova.addConstructor(FileDownloader.install); 

자바 부분의 저장 방법은 다음과 같다. 그것은 JSONObject입니다. uInt8Array의 지시자는 이제 문자열이며 더 이상 주문되지 않습니다. 또한 적어도 "byteBuffer"라는 새 키가 있습니다.

플러그인의 자바 부분으로 전달 될 때 typedArray를 JSONArray로 처리 할 수 ​​있습니까? 아니면이 문제를 다루는 다른 접근 방식이 있습니까?

답변

0

더 좋은 방법이 있습니다.

나는 Sencha Touch를 사용하고 있기 때문에 xhr 개체를 직접 만들 필요가 없습니다. 사실, 문제가 끝난 것처럼, iOS에서 메모리 문제가 발생하고 앱이 더 큰 파일과 충돌합니다.

Ext.Ajax.request()에는 배열 버퍼를 다시 가져 오는 데 사용할 수있는 문서가없는 responseType 옵션이 없습니다. 안드로이드 response.responseBytes에서

window.plugins.filemanager.saveUint8ByteArrayToFile(
      "Download", 
      record.get("title"), 
      response.responseBytes, 
      response.responseBytes.byteLength, 
      function (filePath) { 
       me.onFileSaved(filePath); 
      }, 
      function (message) { 
       me.onFileSaveError(message); 
      } 
     ); 

가베이스 64 인코딩 된 문자열로 변환한다 :

downloadFile: function (record) { 
    var me = this; 
    Ext.Ajax.request({ 
     url: record.get("url"), 
     method: 'GET', 
     success: function (response) { 
      me.onFileDownloaded(response, record); 
     }, 
     failure: function (response) { 
     }, 
     scope: this, 
     responseType: "arraybuffer", 
     timeout: 300000 
    }); 

이 요청의 응답은 다음과 같이 사용할 수있는 arraybuffer이다. iOS에서는 NSData로 변환됩니다.

관련 문제