3
Ext.define('ImageModel', {
        extend: 'Ext.data.Model',
        fields: ['PicID', 'PicUploadedDateTime','PicData']
    });

    var ImgStore = Ext.create('Ext.data.JsonStore', {
        model: 'ImageModel',
        autoLoad: true,
        proxy: {
            type: 'ajax',
            url: 'get-image.php',
            baseParams: {  //here you can define params you want to be sent on each request from this store
                        mainid: 'value1',
                        startdate: 'value2',
                        enddate: 'value3'
                        },
            reader: {
                type: 'json',
                root: 'images'
            }
        }
    });

    var listView = Ext.create('Ext.grid.Panel', {
        region: 'west',
        id : 'imagelist',
        title: 'Select Image',
        width: 200,
        split: true,
        collapsible: true,
        floatable: false,
        title:'Select Image',
        renderTo: Ext.getBody(),
        store: ImgStore,
        multiSelect: true,
        viewConfig: {
            emptyText: 'No images to display'
        },

        columns: [
            {
            text: 'Date Time Uploaded',
            //xtype: 'datecolumn',
            //format: 'Y-m-d H:i:s',
            flex: 65,
            width: 100,
            dataIndex: 'PicUploadedDateTime'
        }]
    });

listView.on('selectionchange', function(view, nodes){
        Ext.getCmp('displayimage') = nodes[0].get("PicData") // display the image on here
        //when listview selected the image,will display the image at here.
    });

リストビューを作成しました。リストビューでselectionchangeを実行すると、に画像が表示されExt.getCmp('displayimage') ます。

nodes[0].get("PicData")選択
した画像データはblob値(すべてJPEGの16進値)ですか、extjsからの画像を表示する方法は?

アップデート

これは私のdisplayimageコードです

button.on('click', function(){
        if (!win) {
            win = Ext.create('widget.window', {
                title: 'View Image',
                closable: true,
                closeAction: 'hide',
                width: 600,
                minWidth: 350,
                height: 550,
                layout: {
                    type: 'border',
                    padding: 5
                        },
                items:[
                        listView, 
                    {                           
                    region: 'center',
                    //xtype: 'tabpanel',
                    minheight: 350,
                    items: [{
                        //title: 'Bogus Tab',
                        xtype : 'image',
                        id : 'displayimage',
                            }]
                    },
                    {
                    region: 'north',
                    margin : "5 0 5 0",
                    //xtype: 'tabpanel',
                    minheight: 350,
                    items: [dr]
                    }]
            });

コードをに変更した後

Ext.getCmp('displayimage').src = 'data:image/jpeg;base64,'+nodes[0].get("PicData") // 

Image corrupt or truncated

これは私がfirebugから受け取るエラーメッセージですが、Pythonを使用して.jpegファイルに変換しようとしたため、バイナリデータが正しいことを確認できます

これは、データベースhttp://pastebin.ca/raw/2314500からの.jpegサンプルblob値(バイナリ文字列)です。

4

2 に答える 2

1

Ext.getCmp('displayimage')がExt.Imgコンポーネントを表すと仮定すると、その「src」プロパティを設定して画像データを含めることができますが、

  • 16進数ではなくbase64としてエンコードする必要があります

  • 通常のURLの代わりに実際のデータを渡すことを示すプレフィックス(たとえば、画像がJpegの場合はdata:image / jpeg; base64)を追加する必要があります

したがって、次のように書く必要があります。

listView.on('selectionchange', function(view, nodes){
    Ext.getCmp('displayimage').src = 'data:image/jpeg;base64,'+nodes[0].get("PicData") // display the image on here
    //when listview selected the image,will display the image at here.
});
于 2013-02-16T18:04:45.853 に答える
1

モデルメソッドを追加する必要があります(そして、別の質問に対する私の回答からコンバーターを使用します):

getImage: function() {
    return this.getBase64(this.get('PicData'));
},
getBase64: function(str) {
    return btoa(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
}

あなたの画像と私の妻の写真を使ったjsfiddleの例。

于 2013-02-17T09:22:01.787 に答える