3

我正在使用 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 constructor'),据我所知,无论如何不可能使用phonegap的文件写入器来写任何东西除了纯文本(我在其他地方已经成功完成)。

我用谷歌搜索了很多,但找不到解决方案。使用 WinJS,我已经能够使用 Windows.Storage.Streams.RandomAccessStream.copyAsync 获取 blob 并保存它,但在 phonegap 中找不到任何类似的功能。

我原以为一定有很多人希望他们的应用程序下载和保存图像、mp3 或其他任何东西,所以我希望那里的一些 phonegap 大师能够为我指明解决方案。

我知道 phonegap 的 FileTransfer,但是,如果我理解正确,我需要向它提供保存在服务器上的文件的 url。我可以更改服务器代码以保存 pdf,但不希望进行此类更改。

顺便说一句,我的应用程序使用的是 SQLlite 数据库,所以也许一个解决方案是将二进制数据粘贴到某个地方并从那里显示它?问题是我不知道如何显示它。

4

1 回答 1

1

不要使用 Blob,而是使用 WebKitBlobBuilder。可以在此处找到 BlobBuilder 的一些示例。该链接显示 BlobBuilder 已过时,但 Android(至少 4.1.2)尚未迁移到 Blob。

于 2013-08-01T21:43:24.540 回答