105 votes

Comment utiliser PrimeFaces p:fileUpload? Méthode d'écouteur est jamais appelé

Je suis en train de télécharger un fichier à l'aide de PrimeFaces, mais l' fileUploadListener méthode n'est pas invoquée après la fin du téléchargement.

Ici est le point de vue:

<h:form>
    <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
        mode="advanced" 
        update="messages"
        sizeLimit="100000" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

    <p:growl id="messages" showDetail="true"/>
</h:form>

Et le haricot:

@ManagedBean
@RequestScoped
public class FileUploadController {

    public void handleFileUpload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

}

J'ai mis un point d'arrêt sur la méthode, mais il n'est jamais appelé. Lors de l'utilisation d' mode="simple" et ajax="false", il est invoqué, mais je veux qu'il fonctionne dans le mode avancé. Je suis à l'aide de Netbeans et Glassfish 3.1.

232voto

BalusC Points 498232

Comme par le PrimeFaces 3.x Guide de l'utilisateur:

2.2 Dépendances

PrimeFaces ne nécessite que JAVA 5+ runtime et un JSF 2.x mise en œuvre obligatoire d'une les dépendances. Il y a quelques facultatif bibliothèques pour certaines fonctions.

Dependency         | Version    | Type     | Description
-------------------+------------+----------+---------------------------------
JSF runtime        | 2.0 or 2.1 | Required | Apache MyFaces or Oracle Mojarra
itext              | 2.1.7      | Optional | DataExporter (PDF).
apache poi         | 3.7        | Optional | DataExporter (Excel).
rome               | 1.0        | Optional | FeedReader.
commons-fileupload | 1.2.1      | Optional | FileUpload
commons-io         | 1.4        | Optional | FileUpload

(notez les deux dernières entrées)

et

3.34 FileUpload

...

Mise en route avec FileUpload

Première chose à faire est de configurer la fileupload filtre qui analyse la demande multiparties. FileUpload filtre doivent correspondre à des Faces Servlet.

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

Simple Fichier De Téléchargement

Simple upload de fichier en mode fonctionne en mode legacy avec un fichier d'entrée dont la valeur doit être un UploadedFile de l'instance.

<h:form enctype="multipart/form-data">
    <p:fileUpload value="#{fileBean.file}" mode="simple" />
    <p:commandButton value="Submit" ajax="false"/>
</h:form>

...

Résumé, vous devez vous assurer de ce qui suit:

  1. commons-fileupload et commons-io sont présents dans la webapp d'exécution du classpath (juste de laisser tomber les petits Pots dans /WEB-INF/lib devrait suffire).

  2. L' FileUploadFilter est mappé sur le <servlet-name> de la FacesServlet comme en été défini dans votre web.xml. Si vous avez donné un <servlet-name> de par exemple facesServlet, alors vous devez le modifier dans l' <filter-mapping> exemple.

  3. L' enctype de la <h:form> doit multipart/form-data.

  4. En simple upload de fichier avec l' mode="simple", l'ajax doit être désactivé sur un PrimeFaces boutons de commande/liens en ajax="false" et vous devez utiliser <p:fileUpload value> avec <p:commandButton action> au lieu de <p:fileUpload fileUploadListener>.

Je dois cependant admettre que la PrimeFaces Guide de l'utilisateur n'est pas assez explicite sur les deux derniers points. Si vous voulez vraiment ajax upload de fichier, puis vous avez besoin de construire:

 <h:form enctype="multipart/form-data">
     <p:fileUpload fileUploadListener="#{fileBean.handleFileUpload}" />
 </h:form>

En vertu de laquelle le handleFileUpload méthode de FileUploadEvent argument à partir de laquelle vous peut obtenir l' UploadedFile de l'instance.

En outre, il existe une autre cause non liée à un PrimeFaces de configuration:

  1. Il y a une autre Filter dans votre webapp qui s'exécute avant le PrimeFaces de téléchargement de fichiers du filtre et a déjà consommé le corps de la requête, par exemple en appelant getParameter(), getParameterMap(), getReader(), et cætera. Un corps de requête ne peut être analysée qu'une seule fois. Lorsque vous appelez l'une de ces méthodes avant de l'upload d'un fichier de filtre fait son travail, puis l'upload d'un fichier de filtre permettra d'obtenir un vide du corps de la requête.

    Pour résoudre ce problème, vous devez mettre la <filter-mapping> de l'upload d'un fichier de filtre avant de l'autre filtre en web.xml. Si la demande n'est pas un multipart/form-data la demande, puis l'upload d'un fichier de filtre seront simplement continuer comme si de rien n'était.

  2. Il y a une autre Filter dans votre webapp qui s'exécute avant le PrimeFaces de téléchargement de fichiers du filtre et a effectué une RequestDispatcher#forward() appel. Généralement, réécriture d'URL, de filtres, tels que PrettyFaces ce faire. Cela déclenche l' FORWARD répartiteur, mais les filtres écoute par défaut sur REQUEST répartiteur.

    Pour corriger cela, vous devez soit mettre l'PrimeFaces de téléchargement de fichiers filtre avant le transfert filtre, ou pour reconfigurer le PrimeFaces de téléchargement de fichiers filtre à écouter sur FORWARD dispatcher:

    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    

    (remarque: vous pouvez spécifier plusieurs <dispatcher> des entrées si vous en avez besoin, afin d'avoir à la fois REQUEST et FORWARD dans une correspondance est aussi légitimement en cours de validité)

  3. Il y a un imbriquée <h:form>. Ce qui est illégal dans le HTML et le comportement du navigateur n'est pas spécifié. Le plus souvent, le navigateur n'envoie pas les données attendues sur "soumettre". Assurez-vous que vous n'êtes pas nidification <h:form>. C'est complètement indépendamment de la forme de l' enctype. Il suffit de ne pas imbriquer les formes, à tous.

Si vous rencontrez toujours des problèmes, eh bien, déboguer le trafic HTTP. Ouvrez le navigateur web du développeur d'outils (appuyez sur la touche F12 dans Chrome/Firebug/IE>9) et vérifiez sur le Net/section Réseau. Si le HTTP cadre a l'air bien, de déboguer le code JSF. Placer un point d'arrêt sur l' FileUploadRenderer#decode() et l'avance à partir de là.


Mise à jour: depuis PrimeFaces 4.x, lorsqu'il est utilisé en combinaison avec la JSF 2.2 et Servlet 3.0, le filtre n'est plus nécessaire. La Servlet 3.0 / JSF 2.2 API native sera utilisé à la place d'Apache Commons FileUpload. Les autres règles restent toutefois les appliquer et de les causes possibles vous pouvez gratter #1 et #2.

30voto

Reinaldo Gil Points 365

Vous utilisez prettyfaces trop? Ensuite, réglez le répartiteur à l'AVANT:

<filter-mapping>
   <filter-name>PrimeFaces FileUpload Filter</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>

2voto

HazeHorizon Points 21

Ressemble javax.des visages.SEPARATOR_CHAR ne doit pas être égal à _

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X