gpt4 book ai didi

java - TypedArray 作为 Cordova 插件参数

转载 作者:太空宇宙 更新时间:2023-11-04 14:40:58 26 4
gpt4 key购买 nike

我正在为 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 编码的字符串。在 iOS 上它将被转换为 NSData。

关于java - TypedArray 作为 Cordova 插件参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com