ExtJS 4 并显示来自 BLOB 的 PDF

ExtJS 4 and display PDF from BLOB

我尝试在单独的 window 中显示 PDF 流,该流来自数据库 BLOB 字段。我的代码如下:

Ext.define('MyApp.view.ViewPDF', {
    extend: 'Ext.window.Window',
    alias: 'widget.mywindow',

    requires: [
        'Ext.toolbar.Toolbar',
        'Ext.button.Button'
    ],

    config: {
        title: '',
        source: ''
    },

    itemId:    'SHOW_PDF',
    closable:  false,
    resizable: true,
    modal:     true,

    onClose: function (clsbtn) {
        clsbtn.up('window').destroy();
    },


    initComponent: function () {
        var my = this;

        Ext.apply(my, {
            items: [
                {
                    xtype:  'panel',
                    layout: 'fit',
                    width:  640,
                    height: 780,
                    items: [
                        {
                            items: {
                                xtype:  'component',
                                align:  'stretch',
                                autoEl: {
                                    tag:      'iframe',
                                    loadMask: 'Creating report...please wait!',
                                    style:    'height: 100%; width: 100%; border: none',
                                    src:      'data:application/pdf;base64,' + tutaj.getSource()
                                }
                            }
                        }
                    ]
                }
            ],
            dockedItems: [
                {
                            xtype:  'toolbar',
                            dock:   'bottom',
                            height: 30,
                            items: [
                                '->',
                                {
                                    xtype:   'button',
                                    baseCls: 'x-btn-default-large',
                                    cls:     'cap-btn',
                                    handler: my.onClose,
                                    width:   55,
                                    margin:  '0, 10, 0, 0',
                                    style:   'text-align: center',
                                    text:    'Close'
                                }
                            ]
                        }
                    ]
        });
        my.callParent();
        my.title = my.getTitle();
    }
});

而且它只能通过 FireFox 浏览器运行。在 Chrome 中,我可以看到空的 window。所以有两个问题(自己无法回答):

  1. 如何更正以上内容以在其他浏览器中显示此 PDF 流

  2. 因为上面代码中的loadMask不能,所以如何在mask中显示文本 工作;仅显示以 window 开头并在显示 PDF 时结束的文本

请多多指教这段代码有什么问题。

我使用 filefield, BLOB and FileReader. I have tested in chrome and Fire Fox. I hope this FIDDLE 创建了一个 FIDDLE 将帮助或指导您解决问题。

代码片段

Ext.create('Ext.form.Panel', {
    renderTo: Ext.getBody(),
    height: window.innerHeight,
    title: 'Iframe Example for PDF',
    bodyPadding: 10,

    items: [{
        xtype: 'fileuploadfield',
        buttonOnly: true,
        buttonText: 'Choose PDF and show via BLOB',
        listeners: {
            afterrender: function (cmp) {
                cmp.fileInputEl.set({
                    accept: '.pdf'
                });
            },
            change: function (f) {
                var file = document.getElementById(f.fileInputEl.id).files[0];
                this.up('form').doSetPDF(file);
            }
        }
    }, {
        xtype: 'fileuploadfield',
        buttonOnly: true,
        buttonText: 'Choose PDF and show via BASE64 ',
        listeners: {
            afterrender: function (cmp) {
                cmp.fileInputEl.set({
                    accept: '.pdf'
                });
            },
            change: function (f) {
                var file = document.getElementById(f.fileInputEl.id).files[0];
                this.up('form').doSetViaBase64(file);
            }
        }
    }, {
        xtype: 'box',
        autoEl: {
            tag: 'iframe',
            loadMask: 'Creating report...please wait!',
            width: '100%',
            height: '100%'
        }
    }],

    //Show pdf file using BLOB and createObjectURL
    doSetPDF: function (file) {
        if (file) {
            var form = this,
                blob, file;

            if (Ext.isIE) {
                this.doSetViaBase64(file)
            } else {
                blob = new Blob([file], {
                        type: 'application/pdf'
                    }),
                    file = window.URL.createObjectURL(blob);

                form.getEl().query('iframe')[0].src = file;
            }
        }
    },
    //Show pdf file using BASE64
    doSetViaBase64: function (file) {
        var form = this,
            reader = new FileReader();

        reader.readAsDataURL(file);
        reader.onload = function () {
            form.getEl().query('iframe')[0].src = this.result;
        };
        reader.onerror = function (error) {
            console.log('Error: ', error);
        };
    }
});