2012-11-16 17 views
5

मैं फ़ाइल एक्सटेंशन को सीमित करने की कोशिश कर रहा हूं जो प्लूपलोड के माध्यम से अपलोड किया जा सकता है।plupload कतार से फ़ाइल निकालें?

क्योंकि फ़िल्टर HTML5 रनटाइम के साथ ठीक से काम नहीं करते हैं, मैं उनका उपयोग नहीं कर सकता। इसलिए मैं नीचे दिए गए कोड FilesAdded घटना

var extensionArray = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx']; 
uploader.bind('FilesAdded', function (up, files) { 
    var invalid = 0; 
    for (var i in files) { 
     var extension = files[i].name 
           .substr((files[i].name.lastIndexOf('.') + 1)) 
           .toLowerCase(); 

     if (extension == '' || -1 === $.inArray(extension, extensionArray)) { 
      uploader.splice(i, 1); //also tried uploader.removeFile(files[i]) 
      invalid++; 
      continue; 
     } 
     //dom manipulation to add file occurs here 
    } 
}); 

से आबद्ध है लेकिन, जबकि इस डोम हेरफेर किसी भी अवैध फ़ाइलों के लिए उत्पन्न रोक रहा है, यह वास्तव में जब मैं आरंभ के रूप में कतार से आइटम निकालने होना प्रतीत नहीं होता है अपलोड वे सब भेज दिया गया है!

यह एचटीएमएल 5 और फ्लैश रनटाइम दोनों पर हो रहा है। मैंने अभी तक दूसरों का परीक्षण नहीं किया है।

FilesRemoved ईवेंट के लिए बाध्यकारी, यह कभी ट्रिगर नहीं होता है! लेकिन console.log('Invalid files detected'); को uploader.splice(... से पहले डालने से पहले इसे कंसोल पर आउटपुट किया जाता है, ताकि लाइन को कॉल किया जा सके।

उत्तर

2

लघु संस्करण: आप init() समारोह बुला के बाद filesAdded घटना करने के लिए बाध्य करने की जरूरत है।

डीबगिंग के लिए मेरा पहला कदम the uncompressed version off github18 नवंबर 2012 को पकड़ना था। एक बार मेरे पास यह था कि मैं इस मुद्दे का पता लगा सकता हूं।

तो प्राथमिक मुद्दा यह प्रतीत होता था कि removeFile() पर कॉल कभी नहीं बुलाया गया था, लेकिन क्यों?

removeFile: function (file) { 
    var i; 

    for (i = files.length - 1; i >= 0; i--) { 
     if (files[i].id === file.id) { 
      return this.splice(i, 1)[0]; 
     } 
    } 
} 

ठीक है, बहुत सरल है, यह फ़ाइलों सरणी के माध्यम से लूप और अगर वहाँ मिलान आईडी है कि एक फाइल है तो हम जोड़ फ़ंक्शन को कॉल करें: के रूप में

removeFile() परिभाषित किया गया था।

तो, स्प्लिस कैसा दिखता है? इतना है कि जहां FilesRemoved ईवेंट को ट्रिगर किया जाना चाहिए था,

splice:function (start, length) { 
    var removed; 

    // Splice and trigger events 
    removed = files.splice(start === undef ? 0 : start, length === undef ? files.length : length); 

    this.trigger("FilesRemoved", removed); 
    this.trigger("QueueChanged"); 

    return removed; 
} 

ठीक है, तो क्यों यह नहीं था:

splice() के रूप में परिभाषित किया गया था?

removeFile() समारोह में वापस, के रूप में बताया गया है, यह केवल जोड़ कॉल करता है, तो उससे मिलते-जुलते आईडी पाया जाता है।

तो, अगला कदम यह पता लगाना था कि निकालने के फ़ंक्शन को भी कहा जा रहा था या नहीं। removeFile called []

हममम, एक खाली सरणी:

पहली पंक्ति के रूप console.log('removeFile called', files); सम्मिलित करना हमें उत्पादन दे दी है!

ठीक है, ऐसा लगता है कि FilesAdded ईवेंट के लिए बाध्यकारी हमारे सामान्य व्यवहार को रोक रहा है, कोई समस्या नहीं है। आइए बस हमारे FilesAdded बाध्यकारी में जोड़ें। और देखो और देखो। जब हम प्रारंभ क्लिक करते हैं, केवल सही फाइलें भेजी जाती हैं।

यह काम कर रहा है ... लेकिन काफी नहीं।
मेरे पास डीबगिंग उद्देश्यों के लिए, वहां कुछ अतिरिक्त बाइंडिंग थीं, उनमें से एक QueueChanged पर थी। इस बार प्रत्येक बार कतार में फाइलों की मात्रा लॉग गई थी।

मैं क्या देखा है कि कतार में फ़ाइलों की संख्या वास्तव में दर्शाती नहीं रहा था कि कतार से निकाल दिया फ़ाइलों था।

तो, एक त्वरित console.log(uploader.files.length) और इस बात की पुष्टि की है कि वहाँ कुछ और यहाँ पर जा रहा था।

अगला कदम क्या डिफ़ॉल्ट कार्रवाई फ़ाइलें जोड़ने के लिए था को देखने के लिए किया गया था।

खोज रहे हैं मैंने देखा है कि डेवलपर्स के रूप में अच्छी तरह घटना के लिए बाध्य करने का फैसला किया, init समारोह के अंदर यह कर। मेरे परिप्रेक्ष्य से इसे देखकर एक अजीब विकल्प। लेकिन यह उनकी पसंद है।

तो, उनके बाध्यकारी के अंदर देखकर उनके पास files.push(file) भी था जिसका अर्थ है कि हम सरणी में सही फ़ाइलों के सभी फाइलें + डुप्लिकेट प्राप्त कर रहे थे।

यह देखते हुए कि बाध्यकारी init(), समारोह में हो रहा था, मैं अपने बंधन से uploader.files.push(file) हटा दिया, मेरी FilesAdded से पहले बंधन को init() कॉल ले जाया गया। और अब सब ठीक काम करता है।

-1
uploader=newplupload.Uploader({ 
//----- 
}); 

uploader.bind('FilesAdded',function(up,files) 
{ 
//---- 
up.refresh();//RepositionFlash/Silverlight 
}); 

uploader.bind('QueueChanged',function(up,files){ 

//#doc-filelist is the id of dive, which shows the Queue 
$('#doc-filelist').html(''); 

$.each(uploader.files,function(i,file){ 
$('#doc-filelist').append(
'<div id="'+file.id+'">'+ 
file.name+'('+plupload.formatSize(file.size)+')<b></b>'+ 
'<spanclass="remove_file"data-file="'+i+'">X</span>'+ 
'</div>'); 
}); 

if(uploader.files.length==0){ 
// #uploadfiles button for start upload 
$('#uploadfiles').addClass('disabled'); 
} 

}); 

uploader.bind('UploadComplete', function (up, file) { 
    up.splice(); 
    up.refresh(); 

}); 


$('.relevant-document').on('click','.remove_file',function(e){ 

uploader.splice($(this).attr('data-file'),1); 

uploader.refresh(); 
}); 
+3

कृपया अपने उत्तर के लिए कुछ स्पष्टीकरण प्रदान करें। –

+0

कोई विवरण जोड़ें या कम से कम कोड को अधिक जानकारीपूर्ण रूप से टिप्पणी करें। – Leo

संबंधित मुद्दे