J'ai actuellement un formulaire HTML dans lequel les utilisateurs remplissent les détails d'une annonce qu'ils souhaitent publier. Je souhaite maintenant pouvoir ajouter une zone de dépôt pour télécharger des images de l'article à vendre.
J'ai trouvé Dropzone.js qui semble faire la plupart de ce dont j'ai besoin. Cependant, lorsque vous consultez la documentation, il semble que vous deviez spécifier la classe du formulaire entier comme dropzone
(par opposition à l' élément d' entrée uniquement ). Cela signifie alors que tout mon formulaire devient la zone de dépôt .
Est-il possible d'utiliser la zone de dépôt uniquement dans une partie de mon formulaire, c'est-à-dire en spécifiant uniquement l'élément en tant que classe "dropzone" , plutôt que la forme entière?
Je pourrais utiliser des formulaires séparés, mais je veux que l'utilisateur puisse tout soumettre avec un seul bouton.
Sinon, existe-t-il une autre bibliothèque qui peut faire cela?
Merci beaucoup
la source
J'ai eu exactement le même problème et j'ai trouvé que la réponse de Varan Sinayee était la seule qui résolvait réellement la question initiale. Cette réponse peut être simplifiée, alors voici une version plus simple.
Les étapes sont:
Créez une forme normale (n'oubliez pas la méthode et l'enctype args car cela n'est plus géré par dropzone).
Mettez un div à l'intérieur avec le
class="dropzone"
(c'est ainsi que Dropzone s'y attache) etid="yourDropzoneName"
(utilisé pour changer les options).Définissez les options de Dropzone, pour définir l'url où le formulaire et les fichiers seront publiés, désactivez autoProcessQueue (cela ne se produit que lorsque l'utilisateur appuie sur `` soumettre '') et autorisez plusieurs téléchargements (si vous en avez besoin).
Définissez la fonction init pour utiliser Dropzone au lieu du comportement par défaut lorsque le bouton d'envoi est cliqué.
Toujours dans la fonction init, utilisez le gestionnaire d'événements "sendmultiple" pour envoyer les données du formulaire avec les fichiers.
Voilà! Vous pouvez maintenant récupérer les données comme vous le feriez avec un formulaire normal, dans $ _POST et $ _FILES (dans l'exemple cela se produirait dans upload.php)
HTML
JS
la source
processQueue()
appel? J'essaie d'utilisersubmit()
ouclick()
, les deux ne fonctionnent pas.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(désolé je ne sais pas comment mettre des sauts de ligne ici)"Dropzone.js" est la bibliothèque la plus courante pour télécharger des images. Si vous souhaitez que "dropzone.js" ne fasse partie de votre formulaire, vous devez suivre les étapes suivantes:
1) pour le côté client:
HTML:
JQuery:
2) pour le côté serveur:
ASP.Net MVC
la source
Le tutoriel d'Enyo est excellent.
J'ai trouvé que l'exemple de script dans le didacticiel fonctionnait bien pour un bouton intégré dans la zone de dépôt (c'est-à-dire l'élément de formulaire). Si vous souhaitez avoir le bouton en dehors de l'élément de formulaire, j'ai pu le faire en utilisant un événement click:
Tout d'abord, le HTML:
Ensuite, la balise script ...
la source
En plus de ce que disait sqram, Dropzone a une option supplémentaire non documentée, "hiddenInputContainer". Tout ce que vous avez à faire est de définir cette option sur le sélecteur du formulaire auquel vous souhaitez ajouter le champ de fichier caché. Et voila! Le champ de fichier ".dz-hidden-input" que Dropzone ajoute normalement au corps se déplace comme par magie dans votre formulaire. Aucune modification du code source de Dropzone.
Maintenant que cela fonctionne pour déplacer le champ de fichier Dropzone dans votre formulaire, le champ n'a pas de nom. Vous devrez donc ajouter:
à dropzone.js après cette ligne:
vers la ligne 547.
la source
J'ai une solution plus automatisée pour cela.
HTML:
JavaScript:
Laravel:
Pas besoin de désactiver DropZone Discovery et la soumission de formulaire normale sera en mesure d'envoyer le fichier avec tous les autres champs de formulaire via la sérialisation de formulaire standard.
Ce mécanisme stocke le contenu du fichier sous forme de chaîne base64 dans le champ de saisie masqué lorsqu'il est traité. Vous pouvez le décoder en chaîne binaire en PHP via la
base64_decode()
méthode standard .Je ne sais pas si cette méthode sera compromise avec des fichiers volumineux, mais elle fonctionne avec des fichiers ~ 40 Mo.
la source
Vous pouvez modifier le formData en capturant l'événement 'envoi' depuis votre zone de dépôt.
la source
Afin de soumettre tous les fichiers avec d'autres données de formulaire en une seule demande, vous pouvez copier les
input
nœuds cachés temporaires de Dropzone.js dans votre formulaire. Vous pouvez le faire dans leaddedfiles
gestionnaire d'événements:Il s'agit évidemment d'une solution de contournement dépendante des détails de mise en œuvre. Code source associé .
la source
myDropzone.on("thumbnail", () => {})
événement. Le traitement immédiat"addedFile"
du fichier peut toujours être effectuéundefined
lors de l'accès.files[]
mais il est vide quoi que je fasse. Des idées? Le faire à Laravel si cela fait une différence.Je veux apporter une réponse ici car j'ai moi aussi été confronté au même problème - nous voulons que l'élément $ _FILES soit disponible dans le même message qu'un autre formulaire. Ma réponse est basée sur @mrtnmgs mais note les commentaires ajoutés à cette question.
Premièrement: Dropzone publie ses données via ajax
Juste parce que vous utilisez l'
formData.append
option signifie toujours que vous devez vous attaquer aux actions UX - c'est-à-dire que tout se passe dans les coulisses et n'est pas un post de formulaire typique. Les données sont enregistrées dans votreurl
paramètre.Deuxièmement: si vous souhaitez par conséquent imiter une publication de formulaire, vous devrez stocker les données publiées
Cela nécessite un code côté serveur pour stocker votre
$_POST
ou$_FILES
dans une session qui est disponible pour l'utilisateur sur un autre chargement de page car l'utilisateur n'ira pas à la page où les données publiées sont reçues.Troisièmement: vous devez rediriger l'utilisateur vers la page sur laquelle ces données sont exploitées
Maintenant que vous avez publié vos données, les avez stockées dans une session, vous devez les afficher / les actionner pour l'utilisateur dans une page supplémentaire. Vous devez également envoyer l'utilisateur sur cette page.
Donc pour mon exemple:
[Code Dropzone: utilise Jquery]
la source
Ceci est juste un autre exemple de la façon dont vous pouvez utiliser Dropzone.js dans un formulaire existant.
dropzone.js:
Puis, plus tard dans le fichier j'ai mis
Cela suppose que vous ayez un div avec un identifiant de
#botofform
cette façon lors du téléchargement, vous pouvez utiliser les noms des fichiers téléchargés.Remarque: mon script de téléchargement a renvoyé le fichier uploadedfilename.jpeg dubblenote, vous devrez également créer un script de nettoyage qui vérifie le répertoire de téléchargement pour les fichiers non utilisés et les supprime .. si dans un formulaire non authentifié frontal :)
la source
Voici mon exemple, basé sur Django + Dropzone. La vue a sélectionné (obligatoire) et soumettre.
la source