Dans cet article, je vais vous présenter la solution à mettre en place pour répondre à l'une des problématiques les plus courante dans la gestion des pièces-jointes via les XPages : permettre à un utilisateur d'importer un fichier en remplacement d'un autre.
Le cas le plus typique : Gérer en paramètres le logo d'une application
Pour gérer ce paramètre créons la page suivante :
Le code de la page est le suivant:
Le champ qui va contenir les fichiers est arbitrairement appelé 'Logo'
Pour permettre le chargement d'une pièce jointe, on utilise le composant standard "fileUpload".
Ce composant est associé au champ logo. A noter que l'on force le rechargement de la page dès qu'un fichier a été chargé.
Pour permettre de connaitre les fichiers déjà chargés dans le champ logo, on utilise le composant "fileDownload".
Chargeons un premier fichier dans notre document:
Jusqu'ici tout va bien. Si nous chargeons un second fichier, le premier fichier n'est pas remplacé et le second est ajouté à la liste
Dans le cas de notre gestion de logo, un seul fichier ne devrait pas être permis. Il faut donc lorsque l'on charge un fichier supprimer les fichiers déjà uploadés et ne conserver que celui qui vient d'être chargé.
Pour cela nous allons utiliser une propriété intéressante des fichiers joins : l'état du fichier via la propriété getState()
Si la valeur de getState() est 0 alors cela signifie que le fichier est déjà présent dans le document. Sinon, c'est un nouveau fichier qui vient d'être chargé. Il suffit donc de boucler sur la liste des fichiers du champ Logo pour supprimer les anciens fichiers.
Pour une expérience utilisateur avancée, nous allons effectuer ce traitement de suppression dès la sélection d'un fichier. On va donc coder l'évènement onClick du composant fileUpload comme suit :
une fois les fichiers supprimés, il suffit de sauvegarder le document Notes sous-jacent pour actualiser la sélection
Et voilà !