Estoy construyendo una aplicación web de arrastrar y soltar para cargar usando HTML5, y estoy colocando los archivos en un div y, por supuesto, obteniendo el objeto dataTransfer, que me da FileList .
Ahora quiero eliminar algunos de los archivos, pero no sé cómo, ni siquiera si es posible.
Preferiblemente me gustaría eliminarlos de FileList; No tengo ningún uso para ellos. Pero si eso no es posible, ¿debería escribir comprobaciones en el código que interactúa con FileList? Eso parece engorroso.
javascript
html
drag-and-drop
filelist
Heilemann
fuente
fuente
Respuestas:
Si desea eliminar solo varios de los archivos seleccionados: no puede. El Borrador de trabajo de la API de archivos al que vinculó contiene una nota:
Leyendo un poco del Borrador de trabajo de HTML 5, encontré las API de elementos comunes
input
. Parece que puede eliminar toda la lista de archivos configurando elvalue
propiedad delinput
objeto en una cadena vacía, como:Por cierto, el artículo Uso de archivos de aplicaciones web también puede ser de interés.
fuente
length
Creo que solo es de solo lectura. Intento eliminar un elemento con empalme, falla en Chrome.Esta pregunta ya se marcó como respondida, pero me gustaría compartir información que podría ayudar a otros a usar FileList.
Sería conveniente tratar FileList como una matriz, pero los métodos como sort, shift, pop y slice no funcionan. Como han sugerido otros, puede copiar FileList en una matriz. Sin embargo, en lugar de usar un bucle, existe una solución simple de una línea para manejar esta conversión.
Probado bien en FF, Chrome e IE10 +
fuente
Array.from(fileDialog.files)
es más simplefileDialog.files = fileBuffer
?Si está apuntando a navegadores de hoja perenne (Chrome, Firefox, Edge, pero también funciona en Safari 9+) o puede permitirse un polyfill, puede convertir FileList en una matriz usando
Array.from()
así:Entonces es fácil manejar la matriz de
File
s como cualquier otra matriz.fuente
fileArray
nofileList
.Dado que estamos en el ámbito de HTML5, esta es mi solución. La esencia es que empuja los archivos a una matriz en lugar de dejarlos en una lista de archivos, luego, utilizando XHR2, empuja los archivos a un objeto FormData. Ejemplo a continuación.
fuente
He encontrado una solución muy rápida y breve para esto. Probado en muchos navegadores populares (Chrome, Firefox, Safari);
Primero, debe convertir FileList en una matriz
para eliminar el elemento particular use esto
fuente
event.target.files
cual no está vinculada a la entrada, por lo que no puede cambiar nada excepto su variable local ..Sé que esta es una pregunta antigua, pero ocupa un lugar destacado en los motores de búsqueda con respecto a este tema.
las propiedades en el objeto FileList no se pueden eliminar, pero al menos en Firefox se pueden cambiar . Mi solución a este problema fue agregar una propiedad
IsValid=true
a los archivos que pasaron la verificación yIsValid=false
a los que no.luego simplemente recorro la lista para asegurarme de que solo las propiedades con
IsValid=true
se agreguen a FormData .fuente
Puede haber una forma más elegante de hacer esto, pero aquí está mi solución. Con Jquery
Básicamente, fijas el valor de la entrada. Clone y coloque el clon en lugar del anterior.
fuente
Esto es extemporáneo, pero tuve el mismo problema que resolví de esta manera. En mi caso, estaba cargando los archivos a través de la solicitud XMLHttp, por lo que pude publicar los datos clonados de FileList mediante la adición de formdata. La funcionalidad es que puede arrastrar y soltar o seleccionar varios archivos tantas veces como desee (seleccionar archivos de nuevo no restablecerá la lista de archivos clonada), eliminar cualquier archivo que desee de la lista de archivos (clonados) y enviar a través de xmlhttprequest lo que sea dejado allí. Esto es lo que hice. Es mi primera publicación aquí, por lo que el código es un poco complicado. Lo siento. Ah, y tuve que usar jQuery en lugar de $ como estaba en el script de Joomla.
Ahora el HTML y los estilos para esto. Soy bastante novato, pero todo esto realmente funcionó para mí y me tomó un tiempo resolverlo.
Los estilos para eso. Tuve que marcar algunos de ellos! Importantes para anular el comportamiento de Joomla.
Espero que esto ayude.
fuente
Gracias @Nicholas Anderson simple y directo, aquí está su código aplicado y trabajando en mi código usando jquery.
HTML.
CÓDIGO JS
fuente
En vue js:
fuente
Si tiene la suerte de enviar una solicitud de publicación a la base de datos con los archivos y tiene los archivos que desea enviar en su DOM
simplemente puede verificar si el archivo en la lista de archivos está presente en su DOM y, por supuesto, si no lo está, simplemente no envíe ese elemento a la base de datos.
fuente
Es posible que desee crear una matriz y usarla en lugar de la lista de archivos de solo lectura.
Después de ese punto, realice la carga contra su lista en lugar de la lista incorporada. No estoy seguro del contexto en el que está trabajando, pero estoy trabajando con un complemento de jquery que encontré y lo que tuve que hacer fue tomar la fuente del complemento y ponerlo en la página usando
<script>
etiquetas. Luego, por encima de la fuente, agregué mi matriz para que pueda actuar como una variable global y el complemento pueda hacer referencia a ella.Entonces fue solo cuestión de intercambiar las referencias.
Creo que esto le permitiría también agregar arrastrar y soltar como nuevamente, si la lista incorporada es de solo lectura, ¿de qué otra manera podría obtener los archivos soltados en la lista?
:))
fuente
FileList
objeto a lamyReadWriteList
variable, cambia su tipo deArray
aFileList
, por lo que esta no es una solución.Solo cambio el tipo de entrada al texto y de nuevo al archivo: D
fuente