Arrastrar y soltar archivos en la entrada de archivos HTML estándar.

Resuelto Rudie asked hace 13 años • 15 respuestas

Hoy en día podemos arrastrar y soltar archivos en un contenedor especial y cargarlos con XHR 2. Muchos a la vez. Con barras de progreso en vivo, etc. Cosas muy interesantes. Ejemplo aquí.

Pero a veces no queremos tanta frialdad. Lo que me gustaría es arrastrar y soltar archivos, muchos a la vez, en una entrada de archivo HTML estándar : <input type=file multiple>.

¿Es eso posible? ¿Hay alguna manera de 'rellenar' la entrada del archivo con los nombres de archivo correctos (?) desde el menú desplegable del archivo? (Las rutas de archivo completas no están disponibles por razones de seguridad del sistema de archivos).

¿Por qué? Porque me gustaría enviar un formulario normal. Para todos los navegadores y todos los dispositivos. Arrastrar y soltar es solo una mejora progresiva para mejorar y simplificar la UX. El formulario estándar con entrada de archivo estándar (+ multipleatributo) estará allí. Me gustaría agregar la mejora HTML5.

editar
Sé que en algunos navegadores a veces (casi siempre) puedes colocar archivos en la entrada del archivo. Sé que Chrome suele hacer esto, pero a veces falla y luego carga el archivo en la página actual (un gran error si estás completando un formulario). Quiero engañarlo y protegerlo del navegador.

Rudie avatar Nov 04 '11 15:11 Rudie
Aceptado

Lo siguiente funciona en Chrome y FF, pero todavía tengo que encontrar una solución que cubra también IE10+:

// dragover and dragenter events need to have 'preventDefault' called
// in order for the 'drop' event to register. 
// See: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_operations#droptargets
dropContainer.ondragover = dropContainer.ondragenter = function(evt) {
  evt.preventDefault();
};

dropContainer.ondrop = function(evt) {
  // pretty simple -- but not for IE :(
  fileInput.files = evt.dataTransfer.files;

  // If you want to use some of the dropped files
  const dT = new DataTransfer();
  dT.items.add(evt.dataTransfer.files[0]);
  dT.items.add(evt.dataTransfer.files[3]);
  fileInput.files = dT.files;

  evt.preventDefault();
};
<!DOCTYPE html>
<html>
<body>
<div id="dropContainer" style="border:1px solid black;height:100px;">
   Drop Here
</div>
  Should update here:
  <input type="file" id="fileInput" />
</body>
</html>
Expandir fragmento

Probablemente querrás usar addEventListenero jQuery (etc.) para registrar tus controladores de evt; esto es sólo por razones de brevedad.

jlb avatar Aug 16 '2016 07:08 jlb

Hice una solución para esto.

Mostrar fragmento de código

La funcionalidad Arrastrar y soltar de este método solo funciona con Chrome, Firefox y Safari. (No sé si funciona con IE10), pero para otros navegadores, el botón "O haga clic aquí" funciona bien.

El campo de entrada simplemente sigue el mouse al arrastrar un archivo sobre un área, y también agregué un botón.

Descomentar opacidad:0; la entrada del archivo solo es visible para que puedas ver lo que está pasando.

BjarkeCK avatar Oct 03 '2012 17:10 BjarkeCK