Actualmente tengo un formulario HTML en el que los usuarios completan los detalles de un anuncio que desean publicar. Ahora quiero poder agregar una zona de caída para subir imágenes del artículo a la venta.
He encontrado Dropzone.js que parece hacer la mayor parte de lo que necesito. Sin embargo, al examinar la documentación, parece que debe especificar la clase de todo el formulario como dropzone
(en lugar de solo el elemento de entrada ). Esto significa que toda mi forma se convierte en la zona de caída .
¿Es posible utilizar la zona de caída en solo una parte de mi formulario, es decir, especificando solo el elemento como clase "zona de caída" , en lugar de todo el formulario?
Podría usar formularios separados, pero quiero que el usuario pueda enviarlo todo con un solo botón.
Alternativamente, ¿hay otra biblioteca que pueda hacer esto?
Muchas gracias
fuente
Tuve exactamente el mismo problema y descubrí que la respuesta de Varan Sinayee fue la única que realmente resolvió la pregunta original. Sin embargo, esa respuesta se puede simplificar, así que aquí hay una versión más simple.
Los pasos son:
Crea una forma normal (no olvides el método y los argumentos enctype ya que dropzone ya no lo maneja).
Pon un div dentro con
class="dropzone"
(así es como Dropzone se une a él) yid="yourDropzoneName"
(usado para cambiar las opciones).Establezca las opciones de Dropzone, para establecer la url donde se publicarán el formulario y los archivos, desactive autoProcessQueue (por lo que solo ocurre cuando el usuario presiona 'enviar') y permite múltiples cargas (si lo necesita).
Configure la función init para usar Dropzone en lugar del comportamiento predeterminado cuando se hace clic en el botón Enviar.
Aún en la función init, use el controlador de eventos "sendmultiple" para enviar los datos del formulario junto con los archivos.
Voilà! Ahora puede recuperar los datos como lo haría con un formulario normal, en $ _POST y $ _FILES (en el ejemplo, esto sucedería en upload.php)
HTML
JS
fuente
processQueue()
llamada? Intento usarsubmit()
oclick()
, ambos no funcionan.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(lo siento, no sé cómo poner saltos de línea aquí)El "dropzone.js" es la biblioteca más común para cargar imágenes. Si desea tener "dropzone.js" como parte de su formulario, debe seguir los siguientes pasos:
1) para el lado del cliente:
HTML:
JQuery:
2) para el lado del servidor:
ASP.Net MVC
fuente
El tutorial de Enyo es excelente.
Descubrí que el script de muestra en el tutorial funcionó bien para un botón incrustado en la zona de caída (es decir, el elemento de formulario). Si desea tener el botón fuera del elemento de formulario, pude lograrlo usando un evento de clic:
Primero, el HTML:
Entonces, la etiqueta del script ...
fuente
Además de lo que estaba diciendo sqram, Dropzone tiene una opción adicional no documentada, "hiddenInputContainer". Todo lo que tiene que hacer es establecer esta opción en el selector del formulario al que desea que se agregue el campo del archivo oculto. ¡Y voilá! El campo de archivo ".dz-hidden-input" que Dropzone normalmente agrega al cuerpo se mueve mágicamente en su forma. Sin alterar el código fuente de Dropzone.
Ahora, mientras esto funciona para mover el campo del archivo Dropzone a su formulario, el campo no tiene nombre. Por lo tanto, deberá agregar:
a dropzone.js después de esta línea:
alrededor de la línea 547.
fuente
Tengo una solución más automatizada para esto.
HTML:
JavaScript:
Laravel:
No es necesario deshabilitar DropZone Discovery y el envío de formulario normal podrá enviar el archivo con cualquier otro campo de formulario a través de la serialización de formulario estándar.
Este mecanismo almacena el contenido del archivo como una cadena base64 en el campo de entrada oculto cuando se procesa. Puede decodificarlo de nuevo a una cadena binaria en PHP a través del
base64_decode()
método estándar .No sé si este método se verá comprometido con archivos grandes, pero funciona con archivos de ~ 40 MB.
fuente
Puede modificar el formData capturando el evento 'envío' desde su zona de caída.
fuente
Para enviar todos los archivos junto con otros datos de formulario en una sola solicitud, puede copiar
input
nodos ocultos temporales de Dropzone.js en su formulario. Puede hacerlo dentro deladdedfiles
controlador de eventos:Obviamente, esta es una solución alternativa que depende de los detalles de implementación. Código fuente relacionado .
fuente
myDropzone.on("thumbnail", () => {})
evento. Hacer el procesamiento inmediatamente en"addedFile"
el archivo aún podría realizarseundefined
al acceder.files[]
pero está en blanco, no importa lo que haga. ¿Algunas ideas? Haciéndolo en Laravel si hace alguna diferencia.Quiero contribuir con una respuesta aquí, ya que yo también me he enfrentado al mismo problema: queremos que el elemento $ _FILES esté disponible como parte de la misma publicación que otro formulario. Mi respuesta se basa en @mrtnmgs, sin embargo, toma nota de los comentarios agregados a esa pregunta.
En primer lugar: Dropzone publica sus datos a través de ajax
El hecho de que use la
formData.append
opción significa que debe abordar las acciones de UX, es decir, todo esto ocurre detrás de escena y no es una publicación de formulario típica. Los datos se publican en suurl
parámetro.En segundo lugar: si desea imitar una publicación de formulario, deberá almacenar los datos publicados
Esto requiere un código del lado del servidor para almacenar su
$_POST
o$_FILES
en una sesión que esté disponible para el usuario en otra carga de página, ya que el usuario no irá a la página donde se reciben los datos publicados.En tercer lugar: debe redirigir al usuario a la página donde se activan estos datos.
Ahora que ha publicado sus datos, los ha almacenado en una sesión, debe mostrarlos / activarlos para el usuario en una página adicional. También debe enviar al usuario a esa página.
Entonces para mi ejemplo:
[Código de Dropzone: utiliza Jquery]
fuente
Este es solo otro ejemplo de cómo puede usar Dropzone.js en un formulario existente.
dropzone.js:
Luego, más adelante en el archivo puse
Esto supone que tiene un div con id de
#botofform
esa manera cuando carga puede usar los nombres de los archivos cargados.Nota: mi secuencia de comandos de carga devolvió la dubblenote de nombre de archivo cargado. Jpeg. También necesitaría crear una secuencia de comandos de limpieza que verifique el directorio de carga en busca de archivos no utilizados y los elimine ...
fuente
Aquí está mi muestra, se basa en Django + Dropzone. Ver tiene seleccionar (requerido) y enviar.
fuente