IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

[RichFaces] rich:fileUpload utilisé pour une messagerie


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut [RichFaces] rich:fileUpload utilisé pour une messagerie
    Bonjour,

    J'aimerais utiliser le composant rich:fileUpload pour uploader des documents qui seront joint à un courrier. Il faut donc que l'utilisateur puisse ajouter des fichiers mais aussi en retirer...

    Voici le composant utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <rich:fileUpload id="CourrierPJ"
            doneLabel="Téléchargement terminé"
            addControlLabel="Ajouter"
            uploadControlLabel="Télécharger"
            cancelEntryControlLabel="Annuler"
            clearControlLabel="effacer"
            clearAllControlLabel="Tout effacer"
            progressLabel="en cours..."
            sizeErrorLabel="Taille du document trop importante"
            stopEntryControlLabel="Arrêter"
            stopControlLabel="Tout arrêter"
            transferErrorLabel="Erreur de transfert"
     
            listHeight="116px"
            listWidth="600px"
            noDuplicate="true"
     
            uploadData="#{posterCourrierHandler.fileUploadBean.filesList}"
            immediateUpload="#{posterCourrierHandler.fileUploadBean.autoUpload}"
            allowFlash="#{posterCourrierHandler.fileUploadBean.useFlash}"
     
            maxFilesQuantity="#{posterCourrierHandler.fileUploadBean.uploadsAvailable}"
     />
    Le soucis c'est qu'une fois qu'on télécharge les fichiers ajoutés, il n'est plus possible de les supprimer de la liste... et comme j'ai mis 5 fichiers joints maximum, je me retrouve bloqué sur mon écran si j'ai chargé 5 fichiers et que je souhaite en changer.

    Ce à quoi j'aimerais arriver c'est que lorsqu'on clique sur un bouton clear, cela supprime aussi le fichier correspondant téléchargé. De même pour tous les fichiers avec le bouton clearAll.

    Je suis parvenu à approcher cela en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <a4j:support event="onclear" 
           action="#{posterCourrierHandler.fileUploadBean.clearUploadData}"
           reRender="CourrierPJ" immediate="true" />
    Cependant, cette action se fait pour tous les fichiers, quelquesoit le bouton clear que je sélectionne.... :s.

    Voici mon contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class FileUploadBean implements Serializable{
    	private int uploadsAvailable = 5;
    	private boolean autoUpload = true;
    	private boolean useFlash = false;
            private List<UploadItem> filesList = new ArrayList<UploadItem>();
     
    	public synchronized void listener(UploadEvent event) throws Exception{
                  filesList.add(event.getUploadItem());
    	}
     
    	public String clearUploadData() {
    		filesList.clear();
    		setUploadsAvailable(5);
    		return null;
    	}
     
            getters et setters...
    }

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    Bon... ça ne donne pas beaucoup d'aide ici. Enfin, pour vous inspirer, je vais vous donner le début de la réponse que j'ai trouvé (en espérant qu'elle ai une fin...).

    Tout d'abord, il m'a fallu trouver comment récupérer l'objet dans l'évènement et le catcher une fois l'action envoyée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclear="var entree = event.memo.entry;"
    Ceci fait, j'ai bidouillé en javascript pour pouvoir utiliser le nom du fichier comme discriminant : J'ai créé un petit formulaire caché qui prend le nom du fichier et execute une action.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <a4j:form id="CleanForm">
          <h:inputText style="visibility: hidden;position: absolute;" id="CleanFileName"
                             value="#{posterCourrierHandler.fileUploadBean.selectedFileName}" />
           <a4j:commandButton style="visibility: hidden;position: absolute;" id="CleanButton"
                             action="#{posterCourrierHandler.fileUploadBean.clean}" 
                             onclick="if(!confirm('pika ?')) return false;"
                             reRender="CleanFileName,CourrierPJ" />
    </a4j:form>
    le onclear devient le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    onclear="if(event.memo.entry){
         $('CleanForm:CleanFileName').value=event.memo.entry.fileName;
    };
    $('CleanForm:CleanButton').click();"
    L'action du bouton est bien exécutée.

    J'applique ensuite mon action clean() (dans posterCourrierHandler.fileUploadBean). La propriété selectedFileName est setté correctement.

    Cependant, une fois la fonction appellée, la liste complète du rich:fileUpload s'efface complètement ??!!!

    Est-ce que quelqu'un saurait continuer un peu cette piste ? (on ne pourra pas dire que je n'ai pas creusé :p).

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    Bon, toujours pas d'aide :s. Je vais poursuivre un peu alors pour votre culture générale :

    J'ai découvert que pour débloquer les fichiers télécharger dans le rich:fileUpload il faut modifier la propriété js uploadedCount.
    Mon code pour onclear devient le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    onclear="if(event.memo.entry){
          var count = $('CourrierForm:mylettranetCourrierPJ').component.uploadedCount;
          $('CourrierForm:mylettranetCourrierPJ').component.uploadedCount=count-1;
          $('CourrierCleanForm:CourrierCleanFileName').value=event.memo.entry.fileName;
    }
    else
          $('CourrierForm:mylettranetCourrierPJ').component.uploadedCount=0;
    $('CourrierCleanForm:mylettranetCourrierCleanButton').click();"
    Dans mon controleur, je supprime l'objet sélectionné en comparant les nom de fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public synchronized void clean() {
            if (!selectedFileName.equals("")) {
                for (FileBean item : fileBeansList) {
                    if (item.getName().equals(selectedFileName)) {
                        fileBeansList.remove(item);
                        break;
                    }
                }
            } else {
                fileBeansList.clear();
            }
     
            selectedFileName = "";
    }
    J'arrive donc à catcher la création pour modifier la liste des fichiers uploadés et et à catcher la suppression pour supprimer l'objet dans la liste lorsqu'ils sont effacés en Javascript.

    Cependant, j'ai un dernier problème. Lorsque les objets sont ajoutés ou supprimés de ma liste, il arrive quelques fois que la liste soit traitée mais pas persistée. Du coup, il me manque des fichiers dans ma liste d'upload par rapport à ce qui est affiché sur le composant js.

    Je détaille :
    J'ajoute un fichier. Je récupère l'évènement via le listener (placé sur fileUploadListener). Je récupère le fichier et le nom du fichier de l'évènement en créant un objet File que je place dans une liste (créée lors du constructeur).
    J'affiche le contenu de ma liste à la fin du listener pour vérifier.
    Dans tous les cas, la liste affichée est correcte mais lorsque je renouvelle l'opération, je m'apperçois, quelques fois, que l'objet précédent n'est pas dans la liste !!!

    Ca a tout l'air d'un problème de synchronisation mais j'utilise synchronized dans mon listener... quelqu'un aurait-il une idée ??

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    J'ai trouvé une solution sale mais qui marche : je met la liste de fichiers en session...

    Si quelqu'un trouve mieux je suis preneur mais j'arriverais à survivre avec ça.

  5. #5
    Invité de passage
    Inscrit en
    Août 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1
    Par défaut
    Hello collègue de Kebab,

    Ceci va peut être pouvoir t'aider :

    Sur ton evenement "onclear" tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(event.memo.entry){
         var fileName = event.memo.entry.fileName;
    	clearFile(fileName);
    }
    dans ta page jsf ajoute le composant jsf suivant, qui te permets de créer une fonction javascript qui vient faire le pont avec ton code jsf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <a4j:jsFunction name="clearFile" reRender="CourrierPJ" action="#{posterCourrierHandler.fileUploadBean.clearFile}">
                        <a4j:actionparam name="fileName" assignTo="#{posterCourrierHandler.fileUploadBean.fileToDelete}" />
    </a4j:jsFunction>

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    Merci beaucoup Ô valeureux dispenseur de savoir.

    Je t'en suis bien reconnaissant !

Discussions similaires

  1. Richfaces rich:FileUpload : NullPointerException
    Par Nounoursonne dans le forum JSF
    Réponses: 4
    Dernier message: 26/03/2010, 15h14
  2. [RichFaces] <rich:fileUpload> et javascript
    Par len1sensibl dans le forum JSF
    Réponses: 10
    Dernier message: 15/02/2010, 10h32
  3. Optimisation de requête pour une messagerie
    Par okin66 dans le forum Requêtes
    Réponses: 0
    Dernier message: 31/05/2009, 15h39
  4. dynamic cast utilisé pour une recherche
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/02/2009, 21h17
  5. [OE] configuration pour une messagerie de l'université
    Par aminos40 dans le forum Outlook Express / Windows Mail
    Réponses: 1
    Dernier message: 26/03/2007, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo