Comment télécharger un fichier en utilisant JSF 2.2? Où est le fichier sauvegardé?
j'aimerais pouvoir télécharger des fichiers dans mon JSF2.2 application web, donc j'ai commencé à utiliser le nouveau composant <h:inputFile>
.
Ma seule question est, comment puis-je spécifier l'emplacement où les fichiers seront enregistrés dans le serveur? J'aimerais les trouver en tant que Cas java.io.File
. Cela doit être mis en œuvre dans la fève de soutien, mais je ne comprends pas clairement comment.
1 réponses
JSF ne sauvegardera pas le fichier dans un endroit prédéfini. Il sera essentiellement juste vous offrir le fichier téléchargé dans la saveur d'un javax.servlet.http.Part
instance qui est dans les coulisses temporairement stockées dans la mémoire du serveur et/ou l'emplacement de stockage disque temporaire dont vous ne devriez pas vous inquiéter.
pour le sauvegarder à l'endroit désiré, vous devez obtenir le contenu par Part#getInputStream()
et ensuite copie il à la Path
représentant l'emplacement. Vous pouvez le faire dans une méthode (d'écoute) d'action (ajax) de la manière habituelle. Voici un exemple qui le fait avec un écouteur ajax pendant le DOM HTML change
event:
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}">
<f:ajax listener="#{bean.save}" />
</h:inputFile>
</h:form>
private Part file; // +getter+setter
public void save() {
try (InputStream input = file.getInputStream()) {
Files.copy(input, new File(uploads, filename).toPath());
}
catch (IOException e) {
// Show faces message?
}
}
le dossier uploads
et le filename
sont entièrement sous votre contrôle. Par exemple: "/path/to/uploads"
et Part#getSubmittedFileName()
respectivement. Gardez à l'esprit que tout le fichier existant serait écrasé, vous pourriez vouloir utiliser File#createTempFile()
pour autogénérer un nom de fichier.
Faire pas utiliser Part#write()
, comme certains davantage d'autonomie peut suggérer. Il va essentiellement renommer le fichier dans le lieu de stockage temporaire comme identifié par @MultipartConfig(location)
. Aussi ne pas utiliser ExternalContext#getRealPath()
pour enregistrer le fichier téléchargé dans le dossier deploy. Le fichier perdez-vous lorsque la guerre est redéployée pour la simple raison que le fichier n'est pas contenu dans la guerre d'origine. Enregistrez-le toujours sur un chemin absolu à l'extérieur du dossier deploy.
pour une démo en direct, consultez le dernier article de <o:graphicImage>
démo sur OmniFaces showcase .