En estos días podemos arrastrar y soltar archivos en un contenedor especial y subirlos 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 frescura. 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 'llenar' la entrada del archivo con los nombres de archivo correctos (?) Desde la caída del archivo? (Las rutas de archivos 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 UX. El formulario estándar con entrada de archivo estándar (+ multiple
atributo) estará allí. Me gustaría agregar la mejora HTML5.
editar
Sé que en algunos navegadores a veces (casi siempre) puede colocar archivos en la entrada del archivo. Sé que Chrome generalmente hace esto, pero a veces falla y luego carga el archivo en la página actual (un gran error si está completando un formulario). Quiero engañarlo y a prueba de navegador.
fuente
input type="file" multiple
funcione bien en SafariRespuestas:
Lo siguiente funciona en Chrome y FF, pero todavía no he encontrado una solución que cubra IE10 +:
Probablemente quiera usar
addEventListener
o jQuery (etc.) para registrar sus controladores evt, esto es solo por razones de brevedad.fuente
MSIE
,Trident/
(IE11) yEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari y Chrome, sin embargo, ambos funcionan bien.Hice una solución para esto.
Mostrar fragmento de código
La funcionalidad Arrastrar y soltar para 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 a su mouse cuando arrastra un archivo sobre un área, y también he agregado un botón.
Oportunidad de descomentar: 0; la entrada del archivo solo es visible para que pueda ver lo que está sucediendo.
fuente
Esta es la forma HTML5 "DTHML" de hacerlo. Entrada de formulario normal (que se lee solo como señaló Ricardo Tomasi). Luego, si se arrastra un archivo, se adjunta al formulario. Esto requerirá modificaciones en la página de acción para aceptar el archivo cargado de esta manera.
Es aún más jefe si puede hacer que toda la ventana sea una zona de colocación, consulte ¿Cómo detecto un evento de arrastre HTML5 que entra y sale de la ventana, como lo hace Gmail?
fuente
input type=file
.value
propiedad con el archivo más reciente, cada vez que itera por el bucle anterior?fuente
En teoría, podría agregar un elemento superpuesto al
<input/>
, y luego usar sudrop
evento para capturar los archivos (usando la API de archivos) y pasarlos a lafiles
matriz de entrada .Excepto que la entrada de un archivo es de solo lectura . Este es un viejo problema.
Sin embargo, puede omitir el control del formulario por completo y cargarlo a través de XHR (no estoy seguro sobre el soporte para eso):
También puede usar un elemento en el área circundante para cancelar el evento de caída en Chrome y evitar el comportamiento predeterminado de cargar el archivo.
Dejar caer varios archivos sobre la entrada ya funciona en Safari y Firefox.
fuente
Esto es con lo que salí.
Usando Jquery y Html. Esto lo agregará a los archivos de inserción.
fuente
Para una solución solo CSS:
Modificado de https://codepen.io/Scribblerockerz/pen/qdWzJw
fuente
Sé que algunos trucos funcionan en Chrome:
Al soltar archivos en la zona de colocación, obtiene un
dataTransfer.files
objeto, que es unFileList
tipo de objeto, que contiene todos los archivos que arrastró. Mientras tanto, el<input type="file" />
elemento tiene la propiedadfiles
, que es el mismoFileList
tipo de objeto.Entonces, simplemente puede asignar el
dataTransfer.files
objeto a lainput.files
propiedad.fuente
input.files
no puede = (Para cualquiera que esté buscando hacer esto en 2018, tengo una solución mucho mejor y más simple que todas las cosas viejas publicadas aquí. Puede crear un cuadro atractivo de arrastrar y soltar con solo HTML, JavaScript y CSS.
(Solo funciona en Chrome hasta ahora)
Comencemos con el HTML.
Luego llegaremos al estilo.
Después de hacer esto, ya se ve bien. Pero me imagino que te gustaría ver qué archivo subiste en realidad, así que haremos algo de JavaScript. ¿Recuerdas ese lapso de valor pfp? Ahí es donde imprimiremos el nombre del archivo.
Y eso es.
fuente
Impresionante trabajo de @BjarkeCK. Hice algunas modificaciones a su trabajo, para usarlo como método en jquery:
Violín de trabajo
fuente
Pocos años después, he creado esta biblioteca para colocar archivos en cualquier elemento HTML.
Puedes usarlo como
fuente
Lo que podría hacer es mostrar una entrada de archivo y superponerla con su área de colocación transparente, teniendo cuidado de usar un nombre como
file[1]
. {Asegúrese de tener elenctype="multipart/form-data"
interior de su etiqueta FORM.}Luego, haga que el área de colocación maneje los archivos adicionales creando dinámicamente más entradas de archivo para los archivos 2..number_of_files, asegúrese de usar el mismo nombre base, rellenando el atributo value de manera apropiada.
Por último (front-end) envíe el formulario.
Todo lo que se requiere para manejar este método es alterar su procedimiento para manejar una matriz de archivos.
fuente
multiple
atributo en estos días. No necesita más de 1 entrada de archivo. Sin embargo, ese no es el problema. ¿Cómo consigo losFile
objetos en la entrada del archivo? Estoy pensando que esto requiere algún ejemplo de código ...files
propiedad), pero no me las he arreglado en IE, ¿ha tenido suerte?