plupload динамические multipart_params для текущих загрузок, потерянных при повторной инициализации

У меня есть представление, в котором я инициализирую pluploader. Я могу оставить это представление и по-прежнему разрешать загрузку для завершения. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я повторно вхожу в представление, и есть загрузки, которые все еще выполняются, последний multipart_param для "processId", который был назначен в "BeforeUpload", используется повторно, а не индивидуально для каждого файла.

Вот пример: я бросаю 5 файлов на просмотр. Я оставляю вид. Тем временем 2 файла завершили загрузку. Идентификатор процесса для файла 1 был "0123", а идентификатор процесса для файла 2 был "0124". Затем я снова вхожу в вид. Этот скрипт запускается снова. Все остальные файлы имеют присвоенный идентификатор процесса 0124.

Я уверен, что это происходит потому, что скрипт запускается каждый раз, когда вы входите в представление, и что-то перезаписывается, но я пока не нашел решения.

Вы можете видеть в области uploader.fileAdded, что я создаю случайную серию int, называемую processId с этой строкой

var processId = process.createProcessId(file.index);

Затем ниже, в BeforeUpload, я присваиваю этот processId для multipart_param, чтобы я мог назначать уникальный идентификатор процесса для каждой загрузки.

uploader.settings.multipart_params.processId        = file.processId;

Сценарий

/* detects when a user drags files from the desktop */
initDragDetector:function(){
    var runtimes        = ui.getUploadRunTimes();
    var tmpId           = Math.random();                

    uploader = new plupload.Uploader({
        runtimes            :runtimes,
        max_file_size       :'500mb',
        url                 :jQuery('#upSrvUrl').val(),
        drop_element        :'uploadOverlay',
        browse_button       :'uploadOverlay',
        filters : [
            {title : "Image files", extensions : "jpg,tif,png,psd"},
        ],
        max_file_count      :100,
        multipart_params    :{rnd_id:Math.random(),tmp_sid:tmpId},
        multi_selection     :true,
        file_data_name      :'upfile_0',
    });

    //INITIALIZATION HANDLER 1
    uploader.bind('Init',function(up, params){
        uploader.settings.multipart_params.mount                = jQuery('#mount').val(); 
        uploader.settings.multipart_params.publisherId          = jQuery('#publisherId').val();
        uploader.settings.multipart_params.upload_range         = 100;

        if(uploader.features.dragdrop){
            var el      = jQuery("#uploadOverlay");

            el[0].ondragover = function(event) {
                event.dataTransfer.dropEffect = "copy";
            };
            el[0].ondragenter = function(e) {
                if(e.dataTransfer.types.length < 4){
                    el.show();
                }
            };
            el[0].ondrop = function() {
                if(jQuery('.photoThumbContainer').length > 0){
                    el.hide();
                }
            };
        }
    });

    //FILES ADDED HANDLER 2 (called after a drop of files)
    uploader.bind('FilesAdded', function(up, files){
        var i = 0;
        plupload.each(files, function(file) {
            file.index = i;
            uploader.fileAdded(file);  
            i++;
        });
        uploader.start();
    });

    //inject the file into the interface (before before upload function)
    uploader.fileAdded = function(file){
        var processId           = process.createProcessId(file.index);
        //added to the file object and passed into the registration
        file.processId          = processId;
    };

    //BEFORE EACH UPLOAD HANDLER 3
    //Note: this has to be here for any variable passed that changes per file. For example the processId.
    uploader.bind('BeforeUpload',function(up,file){
        var processId       = file.processId;
        var photoDiv        = jQuery('#photo'+processId+' .photoThumbDiv');
        var image           = jQuery(new Image()).appendTo(photoDiv);
        var preloader       = new mOxie.Image();

        preloader.downsize(100,100);
        preloader.onload    = function() {
            var img         = preloader.getAsDataURL();
            jQuery('#photo'+processId+' .photoThumbDiv').html('<img src="'+img+'">');
        };
        preloader.load(file.getSource());

        uploader.settings.multipart_params.processId        = file.processId;
    });

    //PROGRESS HANDLER 4
    uploader.bind('UploadProgress',function(up,file){
        var processId   = file.processId;
        var pb          = collection.getProgressBar(processId);
        if(file.percent<100){
            var progress = file.percent;
            pb.html('<div class="progressBar"><div class="progressBarColor"> </div></div>');
            jQuery('#photo'+processId+' .progressBarColor').css({width:progress+'%'});
        }else{
            pb.html('<div class="loaderSmall"></div> Processing');
        }
    });

    //FILE FINISHED HANDLER 5 
    uploader.bind('FileUploaded',function(up,file,info){
        var processId       = file.processId;
        var fileName        = file.name;
        file.fileName       = file.name;
        var params          = file;
        delete params.getNative;
        delete params.getSource;
        delete params.destroy;
        ui.request('registerFile','Photo',params);

        //ALL COMPLETE
        if(uploadedCnt == up.files.length){
            //uploader.splice();
            uploader.refresh();
        }
    });

    //GENERAL ERROR HANDLER -
    uploader.bind('Error', function(up, err) {
        switch(err.code){
            case plupload.FILE_EXTENSION_ERROR:
                fileExtensions = '';
                jQuery.each(up.settings.filters.mime_types,function(index,up) {
                    if(fileExtensions==''){
                        fileExtensions=up.extensions;
                    }else{
                        fileExtensions+=","+up.extensions;
                    }
                });
                var isOrAre = (fileExtensions && fileExtensions.indexOf(',') !== -1) ? 'are':'is';
                alertBox.msg("Only "+fileExtensions+" "+isOrAre+" accepted. Please try again.");
                break;
            case plupload.FILE_SIZE_ERROR:
                alertBox.msg("File size can not be larger than "+up.settings.max_file_size+'.');
                break;
        }
        uploader.refresh(); 
    });

    uploader.init();
},

Любой вклад приветствуется. Благодарю.

1 ответ

Если кто-то заинтересован в решении здесь, это потому, что загрузчик был установлен во всем мире. Добавление 'var' перед загрузкой каждый раз, когда инициализация загрузчика исправляет это.

Другие вопросы по тегам