[英]TypedArray as Cordova plugin parameter
我正在為Cordova 3.3開發一個插件。
在我的javascript部分中,我正在下載一個PDF文件,該文件存儲為uInt8Array。
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();
},
我將uInt8Array提交到cordova插件的save方法。 我的插件的javascript部分如下所示:
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);
Java部分中的save方法如下:
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不再是數組。 這是一個JSONObject。 uInt8Array的索引現在是字符串,不再排序。 另外,至少有一個新的鍵“ byteBuffer”。
當移交給插件的Java部分時,是否有辦法將typedArray視為JSONArray?或者有其他方法可以解決此問題?
有個更好的方法。
因為我使用的是Sencha Touch,所以不需要自己創建xhr對象。 實際上,就像在問題中所做的那樣,它將導致ios中的內存問題,並且應用程序將因較大的文件而崩潰。
Ext.Ajax.request()
有一個未記錄的選項responseType
,可以用來取回數組緩沖區。
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
});
該請求的響應是一個數組緩沖區,可以按以下方式使用:
window.plugins.filemanager.saveUint8ByteArrayToFile(
"Download",
record.get("title"),
response.responseBytes,
response.responseBytes.byteLength,
function ( filePath ) {
me.onFileSaved( filePath );
},
function ( message ) {
me.onFileSaveError( message );
}
);
在Android上, response.responseBytes
將轉換為以base64編碼的String。 在iOS上,它將轉換為NSData。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.