我正在使用Sencha Touch 2.1.1。当我的应用请求pdf时,服务器会为pdf生成二进制数据,将其保存在缓冲区中,最后使用以下命令将其吐出到浏览器
header('Content-Length: '.strlen($this->buffer));
header('Content-disposition: attachment; filename="'.$name.'"');
在使用网络浏览器正常浏览时,浏览器会显示“保存或打开方式”对话框之一。使用Sencha Touch,我可以从服务器获取一个blob,如下所示:
var xhr = new XMLHttpRequest();
console.log('new XMLHttpRequest');
var url = 'http://bladhdeblah.com/ws/Download/';
var params = "loginId=" + loginId + "&sId=" + surveyId;
xhr.open('POST', url, true);
xhr.responseType = 'blob';
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onload = function (e) {
if (this.status == 200) {
Ext.Viewport.setMasked(false);
blob = new Blob([this.response], {type: 'application/pdf'});
console.log('new Blob');
var cd = (this.getResponseHeader("Content-disposition"));
var filenameStart = cd.indexOf("\"") + 1;
var filename = cd.substring(filenameStart, cd.length - 1);
console.log('pdf filename is ' + filename);
if (Ext.os.is.Android) {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
}
}
else {
LRS.util.common.displayAjaxFailure(this.response, 1);
}
};
xhr.send(params)
;
我的问题是phonegap显然不理解'new Blob'(Android上的logcat显示'Uncaught TypeError:Illegal构造函数'),据我所知,在任何情况下都无法使用phonegap的文件编写器来编写任何内容除了纯文本(我已经在其他地方成功完成)之外。
我已经用谷歌搜索了一下,但是找不到解决方案。使用WinJS,我已经能够使用Windows.Storage.Streams.RandomAccessStream.copyAsync获取blob并将其保存,但是在phonegap中找不到任何类似的功能。
我本以为肯定会有很多人希望他们的应用下载并保存图像,mp3或其他内容,所以我希望那里的一些手机专家能够为我提供解决方案。
我知道phonegap的FileTransfer,但是,如果我正确理解的话,我需要向其提供服务器上保存的文件的url。我可以更改服务器代码,以便保存pdf,但不希望进行此类更改。
顺便说一句,我的应用程序使用的是SQLlite数据库,因此可能的解决方案是将二进制数据粘贴到某处并从那里显示?问题是我不知道如何显示它。
最佳答案
代替使用Blob,而使用WebKitBlobBuilder。
可以在here中找到BlobBuilder的一些示例。该链接显示BlobBuilder已过时,但Android(至少为4.1.2)尚未迁移到Blob。
关于cordova - 是否可以使用phonegap保存Blob?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16018771/