ExtJS 上傳下載控件

因工作需要,繼承button自定義一個上傳下載的按鈕控件,因爲框架封裝,和原生的ExtJs可能稍有出入,但是也希望能對後來者有一定的啓發。現將代碼以及最終效果附上。
ExtJs代碼:
Ext.define("Gzjg.Component.JUploadAndDownload", {//自定義的上傳下載控件,點擊彈出一個窗口,可以上傳或者下載文件
    extend: "Scdp.form.JButton",
    mixins: ["Scdp.form.JHidden"],
    alias: ["widget.JUploadAndDownload"],
    width:60,
    iconCls:"temp_icon_16",
    validateOnBlur:!1,
    fileNumber:10,
    fileUploadAction:"file-ftp-upload",
    fileDeleteAction:"file-ftp-delete",
    fileDownloadAction:"file-ftp-download",
    fileType:"txt|zip|rar|png|jpg|bmp|jpeg|doc|docx|xlsx|xls|cvs",
    fileTypeValidate:!1,
    fileTypeError:"文件類型錯誤,請重新選擇!支持文件類型有:文檔、壓縮包、圖片、excel等。",
    callBack:null,
    initComponent:function(){
        this.width=60;
        this.callParent(arguments);
        this.initObjEvents(this);
        var me = this;//定義指向這個控件的指針方便在方便在事件中調用,然後綁定點擊事件
        this.on("click",function(event){
            var status = event.up("IView").uistatus;//獲得當前的頁面狀態
            var filePkMappings = event.gotValue();//獲得控件的文件mapping值
            if(status==""||status==null||status==undefined)//檢查頁面狀態是否正常
            {
                Scdp.MsgUtil.info("未知的界面狀態!");
                return;
            }
            if((status == Scdp.Const.UI_INFO_STATUS_MODIFY)||(status == Scdp.Const.UI_INFO_STATUS_NEW) ||(status==Scdp.Const.UI_INFO_STATUS_VIEW)){//附件編輯狀態
                var formTitle ="";//Window標題
                var formCallBack = null;//Window回調函數
                var formView = null;//Window表單
                var formItems = new Array();//表單Item
                var filePks = new Array();//關聯文件數組
                if(me.strIsAvaliable(filePkMappings))//有關聯的文件
                {
                    filePks = Scdp.StrUtil.trim(filePkMappings).split("|");//獲得文件Mapping數組
                }
                if((status == Scdp.Const.UI_INFO_STATUS_MODIFY)||(status == Scdp.Const.UI_INFO_STATUS_NEW)){//編輯狀態
                    var fileColumn = filePks.length;
                    if(filePks.length>0){//如果有綁定文件,加載文件使其可刪除
                        Ext.each(filePks, function (file,index) {
                            var fileArr = file.split(":");
                            formItems.push(
                                {
                                    layout: 'column',
                                    cid:'column'+index,
                                    border: 0,
                                    items:
                                        [
                                            {
                                                xtype: 'JButton',
                                                text: '<font color="blue">'+fileArr[1]+'</font>',
                                                cid: 'download'+index,
                                                value:fileArr[0],
                                                iconCls:'file_btn',
                                                border: false,
                                                style: {
                                                    'text-decoration': 'underline',
                                                },
                                                listeners: {
                                                    click: function () {
                                                        var postData = {};
                                                        postData.pk = this.value;
                                                        Scdp.doPost(me.fileDownloadAction, postData, function (retData) {
                                                            if (retData.success) {
                                                                Scdp.MsgUtil.info("下載完成!");
                                                            }
                                                        });
                                                    }
                                                }
                                            },
                                            {
                                                xtype: 'JButton',
                                                text: '',
                                                value:fileArr[0],
                                                valueDesc:index,
                                                cid: 'delete' + index,
                                                iconCls:'delete_file_red_btn',
                                                listeners: {
                                                    click: function (e) {
                                                        Scdp.MsgUtil.confirm("是否確定刪除該文件?一旦刪除將不可恢復且必須保存此次修改數據!",function(result){
                                                            if("yes"==result){
                                                                var postdata = {};
                                                                postdata.filePk = e.value;
                                                                Scdp.doAction(me.fileDeleteAction, postdata, function(rlt){//數據庫刪除文件
                                                                    if(rlt.success){
                                                                        Scdp.MsgUtil.info("刪除成功!");
                                                                        //面板移除一行,並且重置FileMapping.
                                                                        var deleteColumn = formView.getCmp("column"+ e.valueDesc);
                                                                        formView.remove(deleteColumn);
                                                                        formView.doLayout();
                                                                        //重置mapping value
                                                                        Ext.each(filePks,function(pk,index){
                                                                            var tmpPk=pk.split(":");
                                                                            if(tmpPk[0]==e.value){
                                                                                filePks.splice(index,1);//移除該位置的pk
                                                                                fileColumn--;
                                                                            }
                                                                        });
                                                                        //重新拼接filePkLst
                                                                        filePkMappings=filePks.join("|");
                                                                        me.sotValue(filePkMappings,null,null,true);//賦值

                                                                        if(fileColumn==(me.fileNumber-1)){
                                                                            formView.add(fileItems);
                                                                            formView.doLayout();
                                                                        }
                                                                    }
                                                                });
                                                            }
                                                        });
                                                    }
                                                }
                                            }
                                        ]
                                });
                        });
                    }
                    var fileItems = {//上傳文件的Item
                        layout: 'column',
                        cid:'column',
                        border: 0,
                        items:[{
                            xtype: 'JFile',
                            cid:'uploadFile',
                            fieldLabel: Scdp.I18N.UPLOAD_FILE_NAME,
                            fileType:me.fileType,
                            fileTypeValidate:me.fileTypeValidate,
                            fileTypeError:me.fileTypeError,
                            listeners:{
                                change:me.fileSelect
                            }
                        },{
                            xtype: 'JButton',
                            text: '添加',
                            iconCls:'add_file_btn',
                            listeners:{
                                click:function(e)
                                {
                                    if(fileColumn<me.fileNumber-1){
                                        var newColumn = Ext.widget("JPanel",{
                                            layout: 'column',
                                            border: 0,
                                            items:[{
                                                xtype: 'JFile',
                                                cid:'uploadFile'+fileColumn,
                                                fieldLabel: Scdp.I18N.UPLOAD_FILE_NAME,
                                                fileType:me.fileType,
                                                fileTypeValidate:me.fileTypeValidate,
                                                fileTypeError:me.fileTypeError,
                                                listeners:{
                                                    change:me.fileSelect
                                                }}]
                                        });
                                        formView.add(newColumn);
                                        formView.doLayout();
                                        fileColumn++;
                                    }
                                    else{
                                        Scdp.MsgUtil.info("對不起,您最多可以添加"+me.fileNumber+"個附件!");
                                    }
                                }
                            }
                        }]
                    };
                    if(fileColumn<me.fileNumber){//壓入上傳文件的Item
                        formItems.push(fileItems);
                    }
                    formCallBack = function (subView){//編輯狀態的回調函數
                        var postdata = {};
                        Scdp.doAction(me.fileUploadAction, postdata, function(rlt){
                            if(rlt.success){
                                var lstPks = rlt.lstPks;
                                for(var pk in lstPks){
                                    if(filePkMappings!=""){
                                        filePkMappings = filePkMappings+"|"+pk+":"+lstPks[pk];
                                    }
                                    else{
                                        filePkMappings=pk+":"+lstPks[pk];
                                    }
                                }
                                me.sotValue(filePkMappings,null,null,true);
                                win.close();
                            }
                        }, null, null, null, subView.getForm());
                    };
                    formTitle = "上傳文件";
                }
                else{//查看狀態Items
                    if(!me.strIsAvaliable(filePkMappings))//檢查是否有附件
                    {
                        Scdp.MsgUtil.info("沒有附件!");
                        return;//沒有附件,中斷執行
                    }
                    Ext.each(filePks,function(file,index){//載入下載文件欄目
                            var fileArr = file.split(":");
                            formItems.push({
                                layout: 'column',
                                border: 0,
                                items: [{
                                    xtype: 'JButton',
                                    text: '<font color="blue">'+fileArr[1]+'</font>',
                                    cid: 'download'+index,
                                    value:fileArr[0],
                                    iconCls:'file_btn',
                                    border: false,
                                    style: {
                                        'text-decoration': 'underline',
                                    },
                                    listeners: {
                                        click: function () {
                                            var postData = {};
                                            postData.pk = this.value;
                                            Scdp.doPost(me.fileDownloadAction, postData, function (retData) {
                                                if (retData.success) {
                                                    Scdp.MsgUtil.info("下載完成!");
                                                }
                                            });
                                        }
                                    }
                                }]
                            });
                        }
                    );
                    formCallBack = function () {//查看狀態回調函數
                        win.close();
                    };
                    formTitle = "下載文件";
                }
                //構建彈出框window,items爲以上構建的items
                formView = Ext.widget("JForm", {
                    height: 200,
                    width: 500,
                    layout: 'form',
                    autoScroll:true,
                    bodyPadding: '10 10 10 10',
                    cid: 'uploadForm',
                    items: formItems
                });
                var win = Scdp.openNewWinByView(formView, formCallBack, 'temp_icon_16', formTitle);
            }
            else if(status == Scdp.Const.UI_INFO_STATUS_NULL)
            {
                Scdp.MsgUtil.info("沒有選擇記錄!");
            }
        });
    },
    setFilePks:function(arr){
        this.filePks=arr;
    },
    setFileNames:function(arr){
        this.fileNames=arr;
    },
    getFilePks:function(){
        return this.filePks;
    },
    getFileNames:function(){
        return this.fileNames;
    },
    beforUpload:function(){
        var me = this;
        return !0;
    },
    afterUpload:function(){
        var me = this;
        return !0;
    },
    strIsAvaliable:function(str){
        return (Scdp.StrUtil.trim(str)!="" && (str!="") && (str != null) && (str!=undefined))
    },
    sotValue: function (a, b,c,d) {
        var status = this.up("IView").uistatus;
        if(status == Scdp.Const.UI_INFO_STATUS_NEW && !d){
            a="";
        }
        this.setValue(a);
        this.cascadeLoad(!1);
        c && (this.oldValue = this.gotRawValue());
        b || this.afterSotValue && this.afterSotValue(this)
    },
    fileSelect:function (event){
        var files = event.fileInputEl.dom.files;
        if(files.length>0){
            var file = files[0];
            var size = file.size;
            if(event.fileTypeValidate){
                var nameSplit = file.name.split(".");//限制上傳文件類型
                var type=nameSplit[nameSplit.length-1];
                if(!(event.fileType.indexOf(type)>-1)){
                    event.reset();
                    Scdp.MsgUtil.info(event.fileTypeError);
                    return;
                }
            }

            if(size>10485760){
                Scdp.MsgUtil.info("附件最大隻支持10M的文件,請重新選擇!");
                event.reset();
                return;
            }
        }
    },
});
該控件是將文件上傳到後臺服務器後把後臺返回的文件key以及名字以"key1:name1|key2:name2"的方式作爲value保存。同時可以上傳多個文件。最終效果圖如下:

控件編輯狀態可以選擇上傳文件,支持多文件上傳

控件編輯狀態可以刪除上傳的文件,同時達到最大文件數不會再顯示添加按鈕

控件查看狀態只能下載文件

發佈了30 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章