UEditor 自定義圖片視頻尺寸校驗

UEditor支持單圖、多圖以及視頻上傳,編輯器配置項支持文件格式、文件大小校驗,對於文件寬高尺寸校驗暫不支持。這裏記錄一下自定義圖片、視頻尺寸校驗過程,內容核心主要是擴展校驗邏輯和增加自定義提示文本。

單圖上傳

單圖上傳的邏輯在ueditor.all.js中,由simpleUpload組件實現,其內部是通過監聽file輸入框的變化,來進行文件校驗和上傳。
下圖initUploadBtn爲初始化簡單上傳按鈕方法,也是進行相關校驗的地方。

initUploadBtn裏默認校驗代碼如下:

var form = btnIframeDoc.getElementById('edui_form_' + timestrap);
var input = btnIframeDoc.getElementById('edui_input_' + timestrap);
var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap);
domUtils.on(input, 'change', function(){
    if(!input.value) return;
    // 省略部分代碼
    /* 判斷後端配置是否沒有加載成功 */
    if (!me.getOpt('imageActionName')) {
        errorHandler(me.getLang('autoupload.errorLoadConfig'));
        return;
    }
    // 判斷文件格式是否錯誤
    var filename = input.value,
        fileext = filename ? filename.substr(filename.lastIndexOf('.')):'';
    if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {
        showErrorLoader(me.getLang('simpleupload.exceedTypeError'));
        return;
    }       
    
    // 校驗通過,上傳文件
    domUtils.on(iframe, 'load', callback);
    form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?' : '&') + params);
    form.submit();
});

可以看到這裏有好幾處判斷邏輯,全部通過後才提交表單上傳文件。對於圖片視頻的尺寸校驗,同樣也可以加在這裏,通過後才提交,以下爲修改後的代碼:

var form = btnIframeDoc.getElementById('edui_form_' + timestrap);
var input = btnIframeDoc.getElementById('edui_input_' + timestrap);
var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap);
domUtils.on(input, 'change', function(){
    if(!input.value) return;
    // 省略部分代碼
    /* 判斷後端配置是否沒有加載成功 */
    if (!me.getOpt('imageActionName')) {
        errorHandler(me.getLang('autoupload.errorLoadConfig'));
        return;
    }
    // 判斷文件格式是否錯誤
    var filename = input.value,
        fileext = filename ? filename.substr(filename.lastIndexOf('.')):'';
    if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {
        showErrorLoader(me.getLang('simpleupload.exceedTypeError'));
        return;
    }       
    //校驗文件尺寸寬度
    var files = this.files;
    var reader = new FileReader();
    reader.readAsDataURL(input.files[0]);
    reader.onload = function (theFile) {
        var image = new Image();
        image.src = theFile.target.result;
        image.onload = function () {
            if (this.width < 1080) {
                showErrorLoader('寬度小於1080');
                return;
            }           
            // 校驗通過,上傳文件
            domUtils.on(iframe, 'load', callback);
            form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?' : '&') + params);
            form.submit();
            };
        };
});

代碼中的校驗參數1080,和提示文本規範作法是加在配置文件中,這裏只起演示作用。

新增的尺寸校驗,是使用FileReader讀取上傳的文件獲得寬高,進而能夠實現相關尺寸或者比例判斷,校驗效果如下:

多圖上傳

多圖上傳主要涉及三個文件,image.htmlwebupload.jsimage.js
webupload.js包含各種驗證,包括文件總大小是否超出、單文件是否超出、文件是否重複等等,這裏也可以增加自定義驗證,它們會在Uploader初始化時被一併加載。

新增自定義圖片尺寸校驗方法如下:

        /**
         * @property {int} [fileSingleWidth=undefined]
         * @namespace options
         * @for Uploader
         * @description 驗證單個文件尺寸滿足要求, 不滿足則不允許加入隊列。
         */
        //======================
        api.addValidator('fileSingleWidth', function () {
            var uploader = this,
                opts = uploader.options,
                minWidth = 1080;

            uploader.on('beforeFileQueued', function (file) {
                let that = this;
                let type = file.type;
                window.URL = window.URL || window.webkitURL;

                var reader = new FileReader();
                reader.readAsDataURL(file.source.source);
                reader.onload = function (theFile) {
                    var image = new Image();
                    image.src = theFile.target.result;
                    image.onload = function () {
                        if (this.width < minWidth) {
                            file.setStatus(WUFile.Status.INVALID, 'exceed_width');
                            that.trigger('error', 'F_EXCEED_SIZE', file);
                            that.removeFile(file);
                            return false;
                        }
                    };
                }
            });
        });

校驗邏輯寫好後,需要在image.jsaddFile方法中增加提示文本。

校驗效果:

視頻上傳

視頻上傳同樣也包含三個文件,video.htmlwebupload.jsvideo.js,處理邏輯與多圖上傳一樣。我們可以在上面校驗圖片寬度的基礎上再擴展支持校驗視頻分辨率是否小於720,代碼如下:

        /**
         * @property {int} [fileSingleWidth=undefined]
         * @namespace options
         * @for Uploader
         * @description 驗證單個文件尺寸滿足要求, 不滿足則不允許加入隊列。
         */
        //======================
        api.addValidator('fileSingleWidth', function () {
            var uploader = this,
                opts = uploader.options,
                minWidth = 1080;
            
            uploader.on('beforeFileQueued', function (file) {
                let that = this;
                let type = file.type;
                window.URL = window.URL || window.webkitURL;
                // 校驗視頻分辨率
                if (type.indexOf('video') > -1) {
                    var video = document.createElement('video');
                    video.preload = 'metadata';
                    video.src = URL.createObjectURL(file.source.source);
                    video.onloadedmetadata = () => {
                        URL.revokeObjectURL(video.src);                                              
                        if (video.videoHeight < 720) {
                            file.setStatus(WUFile.Status.INVALID, 'exceed_height');
                            that.trigger('error', 'F_EXCEED_SIZE', file);
                            that.removeFile(file);
                            return false;
                        }
                    }
                }else{
                    //校驗圖片寬度
                    var reader = new FileReader();
                    reader.readAsDataURL(file.source.source);
                    reader.onload = function (theFile) {
                        var image = new Image();
                        image.src = theFile.target.result;
                        image.onload = function () {
                            if (this.width < minWidth) {
                                file.setStatus(WUFile.Status.INVALID, 'exceed_width');
                                that.trigger('error', 'F_EXCEED_SIZE', file);
                                that.removeFile(file);
                                return false;
                            }
                        };
                    }
                }
            });
        });

vedio.jsaddFile方法中增加校驗文本

校驗效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章