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:
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).
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.
L' enctype
de la <h:form>
doit multipart/form-data
.
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:
-
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.
-
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é)
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.