javascript - plupload events
Plupload-Restringir a un solo archivo (13)
No veo una opción en los documentos de la API de plupload para restringir el número de archivos cargados, a cualquier número, incluso 1.
Doc falla? o la característica falla? Si no existe, estaré trabajando para que eso suceda si alguien lo necesita.
Ahora puede desactivar la selección múltiple configurando la opción selección múltiple en falso
así como esto
var uploader = new plupload.Uploader({
runtimes : ''html5,flash'',
browse_button : ''button_id'',
multi_selection:false, //disable multi-selection
...
El documento oficial está aquí: http://www.plupload.com/documentation.php
Basándome en la segunda respuesta de Jonathon Bolster, escribí este fragmento más simple para restringir la carga al último archivo seleccionado:
uploader.bind(''FilesAdded'', function(up, files) {
while (up.files.length > 1) {
up.removeFile(up.files[0]);
}
});
Después de probar cada una de las soluciones, se me ocurrió la más simple de todas, que parece funcionar.
Estoy usando la api del núcleo y tengo el conjunto de selección múltiple en falso. Luego, después de seleccionar (agregar) el primer archivo, la segunda línea de código, que inserté en el evento FilesAdded, oculta el enlace de búsqueda. No creo que esto se pueda hacer con los widgets de jquery y también he encontrado que, a menos que el enlace de carga cubra donde está el enlace de búsqueda, permanece 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;
});
Eliminar archivos innecesarios directamente antes de subir:
$(''uploadfiles'').onclick = function()
{
while (uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
}
uploader.start();
return false;
};
Es una característica de fallar. Hice una envoltura alrededor de la API de jQuery y esto es lo que hice para que funcione para mí. Mi código tiene alguna otra lógica de negocios, pero debería darte lo suficiente como para comenzar.
Básicamente, enlace al evento FilesAdded
y llame a removeFile
en el objeto del cargador (si hay demasiados archivos). Creo que agregué el tiempo de espera de 50 ms porque me estaba dando problemas con el archivo que aún no existe.
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
es algo que agrego a la instancia de pluploader cuando lo creo.
Edit : En realidad tuve que hacer dos maneras diferentes para esto. Lo anterior solo permitirá que una persona cargue una cierta cantidad de archivos (y, de lo contrario, generará un error).
Este fragmento funciona de manera similar, pero eliminará los archivos existentes y solo cargará los más recientes:
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
});
Me doy cuenta de que esto ha sido respondido, pero una solución con la que fui fue simplemente usar la QueueChanged
llamada QueueChanged
:
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 este código, solo conserva el último archivo seleccionado (en caso de que la razón por la que eligieron nuevamente fue porque eligieron el archivo incorrecto).
Ninguna de estas respuestas realmente funciona.
Si desea usar un cargador personalizado, y cargar un archivo a la vez, no se cargue automáticamente y el último archivo agregado se convertirá en el nuevo archivo.
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(){....
}
Empalmamos toda la matriz porque plup ya agrega todos los archivos dam a la cola y si empalma la cola como la respuesta aceptada, en realidad agregará un archivo cada vez que el usuario intente agregar archivos, y si intenta agregar un nuevo archivo de forma singular mantendrá el archivo antiguo en pos [0] en la matriz de archivos,
luego agregamos el primer archivo de los archivos que intentaron agregar. De esta manera solo hay un archivo en la cola y siempre es el primer archivo del último grupo de archivos que intentaron agregar.
es decir.
Arrastre hacia plupload ''file1.jpg'', ''file2.jpg'', ''file3.jpg''
Borrar toda la cola de Dam, agregar de nuevo ''file1.jpg''
Arrastre hacia plupload ''file4.jpg'', ''file5.jpg'', ''file6.jpg''
Borrar toda la cola de Dam, agregar de nuevo ''file4.jpg''
Arrastre hacia plupload ''file99.jpg''
Borrar toda la cola de Dam, agregar de nuevo ''file99.jpg''
Esto le permite administrar plups personalizados si solo desea cargar un archivo a la vez. Como se indicó, las otras respuestas solo funcionan una vez, o con cargas de inicio automático.
Otra forma de hacer esto:
$(document).ready(function () {
var uploader = new plupload.Uploader({
...
multi_selection: false,
....
});
Saludos
Permitir que solo se cargue un archivo:
uploader.bind(''FilesAdded'', function(up, files) {
$.each(files, function(i, file) {
if(uploader.files.length!=1){uploader.removeFile(file); return;}
});
});
Permitir que un archivo sea seleccionado a la vez:
uploader.bind(''FilesAdded'', function(up, files) {
$.each(files, function(i, file) {
if(i){up.removeFile(file); return;}
});
});
Permitir que un archivo se cargue a la vez:
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);
});
Por que no solo
if (files.length > 1) uploader.splice(1, files.length - 1);
Prueba esto. Funciona bien para mí.
uploader.bind(''FilesAdded'', function(up, files) {
if(uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
uploader.refresh();// must refresh for flash runtime
}
. . . resto
La idea es probar los archivos num en el objeto cargador actual. Si la longitud es mayor que 1, solo use el método uploader.removeFile
. Observe que el argumento es files[0]
que no es un ID de archivo, sino un objeto de archivo completo.
({id:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1})
¡Atentamente!
Puede usar este max_file_count: 5
donde 5 es el número máximo de conteo de carga.
FilesAdded: function(up, files) {
up.files.splice(0,up.files.length-1);
},
multi_selection: false,
usa up.files
, solo files
. files
siempre contendrán un solo elemento lo que seleccionamos del explorador de archivos up.files
es la lista real que debemos reducir al último archivo seleccionado.