2011-10-31 9 views
23

non vedo un'opzione nella documentazione API plupload sulla limitazione del numero di file caricati, a qualsiasi numero, anche 1.Plupload - Limitare a un solo file

Doc fallire? o la funzionalità fallisce? Se non esiste, lavorerò su come farlo se qualcuno ne ha bisogno ..

risposta

20

È una funzionalità fallita. Ho creato un wrapper attorno all'API jQuery e questo è ciò che ho fatto per farlo funzionare per me. Il mio codice ha qualche altra logica aziendale, ma dovrebbe darti abbastanza per iniziare.

Fondamentalmente, associare all'evento FilesAdded e chiamare removeFile sull'oggetto uploader (se ci sono troppi file). Penso di aver aggiunto il timeout di 50 ms perché mi stava dando problemi con il file non ancora esistente.

uploader.bind('FilesAdded', function (up, files) { 
    var i = up.files.length, 
     maxCountError = false; 

    plupload.each(files, function (file) { 

     if(uploader.settings.max_file_count && i >= uploader.settings.max_file_count){ 
      maxCountError = true; 
      setTimeout(function(){ up.removeFile(file); }, 50); 
     }else{ 
      // Code to add pending file details, if you want 
     } 

     i++; 
    }); 

    if(maxCountError){ 
     // Too many files uploaded, do something 
    } 

}); 

max_file_count è una cosa che aggiungo all'istanza pluploader quando creo esso.


Edit: Ho dovuto fare due modi diversi per questo. Quanto sopra consentirà solo a una persona di caricare un certo numero di file (e di generare altrimenti un errore).

Questo frammento funziona in un modo simile - ma sarà rimuovere i file esistenti e caricare solo il più recente:

uploader.bind('FilesAdded', function (up, files) { 
    var fileCount = up.files.length, 
     i = 0, 
     ids = $.map(up.files, function (item) { return item.id; }); 

    for (i = 0; i < fileCount; i++) { 
     uploader.removeFile(uploader.getFile(ids[i])); 
    } 

    // Do something with file details 
}); 
+0

Come ho menzionato nel mio commento sull'altra risposta, sembra che 'max_file_count' è stato aggiunto nel widget dell'interfaccia utente jQuery. Questo non si applica ancora alla mia applicazione, poiché volevo un bucket in cui le persone potessero caricare X numero di file (quindi doveva tenere conto dei file caricati esistenti nel bucket) –

+0

grazie per un modo che funziona senza avere forgiare il loro JS;) – JohnO

+2

Il secondo modo presentato ha rimosso tutti i miei file, s.th. non ci sono file con cui lavorare. L'esecuzione del ciclo solo per 'i <(fileCount - 1)' mantiene solo il file aggiunto più di recente. –

6

È possibile utilizzare questo max_file_count: 5 dove 5 è il numero massimo di conteggio upload.

+4

Questo non funziona. 'max_file_count' non è un'impostazione standard in plupload –

+0

Ho aggiunto il mio attuale utilizzo del codice check-out! E sì, non è negli esempi sul sito. – coder

+0

Oppure si può fare riferimento a questa domanda http://www.plupload.com/punbb/viewtopic.php?pid=5102 – coder

13

Sulla base di Jonathon Bolster di seconda risposta, ho scritto questo frammento più semplice per limitare upload l'ultimo file selezionato:

uploader.bind('FilesAdded', function(up, files) { 
    while (up.files.length > 1) { 
     up.removeFile(up.files[0]); 
    } 
}); 
+1

Questo sembra sparare a il punto sbagliato (prima che venga aggiunto), almeno per il frontend HTML5. Il nuovo file viene aggiunto dopo che questo callback è triggerd. Ciò si traduce in una limitazione a 2 file, non uno. – Joe

+0

(Risolto con un setTimeout pari a zero da aggiungere alla fine del ciclo degli eventi.) – Joe

+0

setTimeOut dove? –

1

consentire ad un solo file da caricare:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(uploader.files.length!=1){uploader.removeFile(file); return;} 
    }); 
}); 

Consenti un file essere selezionato in una volta:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(i){up.removeFile(file); return;} 
    }); 
}); 

Consentire il caricamento di un file in una volta:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(uploader.files.length!=1){uploader.removeFile(file); return;} 
    }); 
}); 
uploader.bind('FileUploaded', function(up, file,response) { 
    up.removeFile(file); 
}); 
3

Perché non solo

if (files.length > 1) uploader.splice(1, files.length - 1); 
2

Prova questo. Funziona bene per me.

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

if(uploader.files.length > 1) 
{ 
    uploader.removeFile(uploader.files[0]); 
    uploader.refresh();// must refresh for flash runtime 
} 

. . . resto

L'idea è di testare i file num nell'oggetto uploader corrente. Se la lunghezza è maggiore di 1, utilizzare il metodo uploader.removeFile. Si noti che l'argomento è files[0] che non è un ID file, ma un oggetto file completo.

({id:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1}) 

Cordiali saluti!

file
0

Rimuovere inutili direttamente prima di caricarlo:

$('uploadfiles').onclick = function() 
      { 
       while (uploader.files.length > 1) 
       { 
         uploader.removeFile(uploader.files[0]); 
       } 

       uploader.start(); 
       return false; 
      }; 
2

ora è possibile disabilitare multi-selezione impostando multi_selection opzione per falso

proprio come questo

var uploader = new plupload.Uploader({ 
    runtimes : 'html5,flash', 
    browse_button : 'button_id', 
    multi_selection:false, //disable multi-selection 
... 

ufficiale doc è qui: http://www.plupload.com/documentation.php

16

Altro modo per farlo:

$(document).ready(function() { 
    var uploader = new plupload.Uploader({ 
     ... 
     multi_selection: false, 
     .... 
    }); 

saluti

+0

Apparentemente non funziona per drag'n'drop ... (nella versione attuale) –

1

Nessuna di queste risposte realmente funzionano.

Se si desidera utilizzare un uploader personalizzato e caricare un file alla volta, nessun caricamento automatico e l'ultimo file aggiunto diventa il nuovo file, utilizzare questo.

uploader.bind('FilesAdded', function(up, files) { 
    // Clear the HTML 
    $('#plupload-files').html(''); 

    // Plup is retarded and does not offer before file added event 
    if (up.files.length > 1) { 
     up.splice(0, up.files.length); 
     up.addFile(files[0]) 
     return; 
    } 

    // $.each(files, function(){.... 
} 

Abbiamo Splice l'intero array perché plup aggiunge già tutti i file diga alla coda e se unisci la coda come la risposta accettata sarà effettivamente aggiungere uno ogni volta che il file l'utente tenta di aggiungere file, e se prova ad aggiungere un nuovo file singolarmente, manterrà il vecchio file in pos [0] nell'array dei file,

quindi aggiungiamo il primo file dei file che hanno provato ad aggiungere. In questo modo c'è sempre un solo file in coda ed è sempre il primo file nell'ultimo gruppo di file che hanno provato ad aggiungere.

ie.

Trascinare in plupload 'file1.jpg', 'file2.jpg', 'file3.jpg'

chiara l'intera coda di diga, aggiungere di nuovo 'file1.jpg'

Trascinare in plupload 'file4 .jpg', 'file5.jpg', 'file6.jpg'

chiara l'intera coda di diga, aggiungere di nuovo 'file4.jpg'

Trascinare in plupload 'file99.jpg'

chiara la fila tutta la diga, aggiungi "file99.jpg"

Ciò consente di gestire i plup personalizzati se si desidera solo caricare un file alla volta. Come indicato, le altre risposte funzionano solo una volta o con i caricamenti di avvio automatico.

0

Dopo aver provato ciascuna delle soluzioni, ho trovato il più semplice di tutte - che sembra funzionare.

Sto usando l'api core e ho multi_selection impostato su false. Quindi, dopo che il primo file è stato selezionato (aggiunto), la seconda riga di codice, che ho inserito nell'evento FilesAdded, nasconde il collegamento di esplorazione. Non penso che questo possa essere fatto con i widget jquery e ho anche scoperto che, a meno che il link di caricamento non copra dove si trova il link di navigazione, rimanga vivo.

uploader.bind('FilesAdded', function(up, files) { 
//line below hides button 
document.getElementById("browse").style.display = "none"; 

var html = ''; 
plupload.each(files, function(file) { 
html += '<li id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></li>'; 
}); 
document.getElementById('filelist').innerHTML += html; 

});

1

Mi rendo conto che questo è stato risposto, ma una soluzione sono andato con era quella di utilizzare solo il QueueChanged callback:

QueueChanged: function(uploader) { 
    // Called when queue is changed by adding or removing files 
    //log('[QueueChanged]'); 
    if(uploader.files.length > 1) { 
     uploader.files.splice(0, (parseInt(uploader.files.length) - 1)); 
    } 
} 

Con questo codice, si mantiene solo l'ultimo file selezionato (nel caso in cui la ragione per cui ha scelto di nuovo era perché hanno scelto il file sbagliato).

2
FilesAdded: function(up, files) { 
     up.files.splice(0,up.files.length-1); 
    }, 
    multi_selection: false, 

uso up.files, appena files. files conterrà sempre un singolo elemento che selezioniamo dal browser di file. up.files è l'elenco effettivo che dobbiamo ridurre per l'ultimo file selezionato.