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

Mr.Er發表於2020-10-19

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方法中增加校驗文字

校驗效果:

相關文章