Question

Dans le cadre du jeu, est-il possible de rejeter un champ

filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));

sans recharger la page ?

J'ai un champ de saisie de fichier qui permet aux utilisateurs de sélectionner des fichiers.Lors du rejet et du rechargement, les fichiers sont effacés et l'erreur est affichée.Je veux que les fichiers qu'ils ont sélectionnés soient là

Comportement actuel :Avant de soumettre le formulaire :

Before

Après soumission (avec erreur :les fichiers ont disparu)

Before

Était-ce utile?

La solution

Champs de saisie de sélection de fichier (c.-à-d. <input type="file" ... />) sont différents des autres champs de saisie : vous ne pouvez pas pré-remplir la valeur côté serveur.Ce serait une énorme faille de sécurité si vous pouviez (pensez à <input type="file" value="/etc/passwd" .. />).Sur le serveur, lorsque vous recevez le formulaire soumis, vous n'obtenez pas le chemin complet du fichier téléchargé, mais simplement le nom du fichier et son contenu.

Si vous avez vraiment besoin de conserver la valeur du champ de saisie de votre fichier, vous devrez emprunter une voie différente :soumettez le formulaire via Ajax (google pour "téléchargement de fichiers ajax" pour certaines techniques et bibliothèques pour vous aider), et utilisez la réponse Ajax pour indiquer si le fichier était valide ou non.


Plus de précisions:Avec la méthode de publication HTML/HTTP normale (que les assistants des formulaires Play utilisent), la page d'origine a disparu et la réponse du serveur est une nouvelle page sans connexion avec la page précédente.Les assistants Play Forms pré-rempliront les champs de saisie de cette page avec les valeurs précédentes, mais comme expliqué ci-dessus, cela n'est pas possible pour un champ de saisie de fichier.

C'est pourquoi il existe des bibliothèques Javascript dédiées au téléchargement de fichiers.Si votre formulaire concerne principalement le téléchargement de fichiers, vous devriez les consulter.(par exemple. http://fineuploader.com).Côté serveur, la cible de la requête Ajax sera une nouvelle action qui traite simplement les fichiers téléchargés et renvoie un message de réussite/échec, que vous afficherez ensuite à l'utilisateur.

Autres conseils

Si le serveur serait capable de manipuler la valeur d'un champ de fichier, ce qui constituerait un risque de sécurité majeur, car nous pouvions prendre n'importe quel fichier du disque dur de l'utilisateur.Si nous examinons les deux exigences que vous avez,

  • Obtenir le contenu du fichier sur le serveur
  • Ne pas déranger l'état de l'interface utilisateur client

    La seule option consiste à utiliser un téléchargeur de fichier Ajax.Donc, votre flux devient maintenant:

    • Soumettez le fichier via AJAX Upload
    • validez le contenu
    • Enregistrez le fichier pour une récupération ultérieure
    • renvoie l'état (OK ou Erreur)
    • Affiche l'erreur sur erreur
    • Une fois que l'ensemble du formulaire est soumis, recherchez le fichier précédemment enregistré

      Vous pouvez probablement tricher un peu si cela ne vous dérange pas de la charge - juste effectuez la validation avec AJAX pour afficher le message d'erreur et laisser le fichier téléchargé à nouveau sur une soumission normale.

      C'est tout sur le travail avec les limites que nous avons.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top