2012-12-27 18 views
5

jQuery File Upload के संबंध में, progress ईवेंट है जो data ऑब्जेक्ट को वापस भेजता है, जैसा कि मैं इसे समझता हूं, प्रत्येक फ़ाइल के लिए प्रगति की रिपोर्ट करता है।यह पहचानने के लिए कि कौन सी फ़ाइल प्रगति के लिए है?

मैं add() ईवेंट के माध्यम से अपने यूआई में फ़ाइल और प्रगति सलाखों को जोड़ रहा हूं, और मैं बाद में progress() ईवेंट के अंदर अपने संबंधित प्रगति सलाखों को अपडेट करना चाहता हूं। मेरी समस्या यह है कि मैं उनसे कैसे मेल खा सकता हूं?

मुझे प्रत्येक फ़ाइल को एक अद्वितीय आईडी देने की आवश्यकता है ताकि मैं उन्हें जोड़ सकूं, लेकिन जहां तक ​​मैं देख सकता हूं, कोई प्रदान नहीं किया जाता है। हमें यह कैसे करना चाहिए?

क्या प्रत्येक फ़ाइल ऑब्जेक्ट के लिए शायद कुछ जावास्क्रिप्ट हैशकोड है?

कुछ कोड:

$('#fileupload').fileupload({ 
    url: 'api/combox_upload.php', 
    dataType: 'json', 
    dropZone: $dropZone, 
    done: function (e, data) { 
     $.each(data.result, function(index, file) { 
      // indicate completeness 
     }); 
    }, 
    add: function(e, data) { 
     $.each(data.files, function(index, file) { 
      console.log(file); 
      $file_uploads.append($('<li>').text(file.name)); 
     }); 
     data.submit(); // start upload immediately 
    }, 
    progress: function(e, data) { 
     console.log(data); 
    } 
}); 

मुझे लगता है कि मैं बहुत तरह $.data का उपयोग करके प्रत्येक फाइल करने के लिए एक अद्वितीय ID संलग्न कर सकते हैं:

var fileId = 0; 

$('#fileupload').fileupload({ 
    url: 'api/combox_upload.php', 
    dataType: 'json', 
    dropZone: $dropZone, 
    done: function (e, data) { 
     $.each(data.result, function(index, file) { 
      // indicate completeness 
     }); 
    }, 
    add: function(e, data) { 
     $.each(data.files, function(index, file) { 
      //console.log(file); 
      console.log(filename, fileId); 
      $.data(file, 'id', fileId++); 
      $file_uploads.append($('<li>').text(file.name)); 
     }); 
     data.submit(); // start upload immediately 
    }, 
    progress: function(e, data) { 
     var progress = parseInt(data.loaded/data.total * 100, 10); 
     $.each(data.files, function(index, file) { 
      console.log($.data(file,'id'), file.name, progress); 
     }); 
     //console.log(data); 
    } 
}); 

बात यह है कि मैं संदेह में हूँ अब के बारे में है कि प्रगति की घटना में यह आपको केवल एक फ़ाइल नहीं देता है, यह आपको 1 फ़ाइल धारण करने वाला एक सरणी देता है ... मुझे यकीन नहीं है कि अगर यह गारंटी है वहां हमेशा 1 फ़ाइल (data.files) है या नहीं।

उत्तर

4

मैं सिर्फ खंड How to tie a file to an element node during the life cycle of an upload कहा जाता है पढ़ना चाहिए:

$(function() { 
    $('#fileupload').fileupload({ 
     dataType: 'json', 
     add: function (e, data) { 
      data.context = $('<p/>').text('Uploading...').appendTo(document.body); 
      data.submit(); 
     }, 
     done: function (e, data) { 
      data.context.text('Upload finished.'); 
     } 
    }); 
}); 
3

आपने अपना कोड पोस्ट नहीं किया है जो वास्तव में फ़ाइल अपलोड या प्रोग्रेस ईवेंट पर बाध्यकारी है, लेकिन मेरा अनुमान है कि आपको fileuploadprogress फ़ंक्शन के आसपास $.proxy रैपर डालना होगा।

$.proxy फ़ंक्शन आपको यह निर्दिष्ट करने की अनुमति देता है कि this फ़ंक्शन में संदर्भित होगा। फिर आपके फ़ंक्शन के अंदर आपको data तक पहुंच होगी और this संदर्भ प्रदान करने में सक्षम होंगे।

+0

लेकिन मैं प्रत्येक फ़ाइल के लिए मैन्युअल रूप से 'progress' घटना बाँध नहीं है ... कि सभी स्वचालित रूप से किया है। मैं प्रत्येक फ़ाइल के लिए एक अलग संदर्भ कैसे सेट करूं? कुछ कोड बीटीडब्ल्यू पोस्ट किया। – mpen

+0

'fileupload' विजेट के लिए प्रलेखन/स्रोत कोड के माध्यम से देखकर इसमें' सिंगलफाइलउप्लोड्स 'नामक एक विकल्प है जो डिफ़ॉल्ट रूप से' सत्य 'पर सेट होता है। यह एक से अधिक फाइल करने में सक्षम है, लेकिन जब तक आप उस मान को 'झूठी' में नहीं बदलते हैं, तो आपको इसकी गारंटी दी जानी चाहिए कि आपके 'फाइल' सरणी में केवल 1 आइटम ही होगा। –

+0

ओह .. मैंने नहीं देखा कि डिफ़ॉल्ट रूप से 'सत्य' था ... लेकिन मुझे यकीन नहीं है कि यह इस मुद्दे को कैसे संबोधित करता है? आप केवल $ $ .fileupload() 'को तुरंत चालू करते हैं और इसे * एक * प्रगति घटना को देखते हैं। '$ .proxy' के साथ आपको प्रत्येक फ़ाइल को एक अलग कॉलबैक में बांधना होगा। – mpen