Stockez-le n'importe où dans un emplacement accessible à l' exception du dossier de projet de l'EDI, alias le dossier de déploiement du serveur, pour les raisons mentionnées dans la réponse à l' image téléchargée uniquement disponible après l'actualisation de la page :
Les modifications dans le dossier de projet de l'EDI ne sont pas immédiatement reflétées dans le dossier de travail du serveur. Il y a une sorte de travail d'arrière-plan dans l'EDI qui veille à ce que le dossier de travail du serveur soit synchronisé avec les dernières mises à jour (c'est en termes IDE appelé «publication»). C'est la principale cause du problème que vous rencontrez.
Dans le code du monde réel, il existe des circonstances dans lesquelles le stockage des fichiers téléchargés dans le dossier de déploiement de l'application Web ne fonctionnera pas du tout. Certains serveurs ne développent pas (par défaut ou par configuration) le fichier WAR déployé dans le système de fichiers du disque local, mais au contraire entièrement dans la mémoire. Vous ne pouvez pas créer de nouveaux fichiers dans la mémoire sans modifier fondamentalement le fichier WAR déployé et le redéployer.
Même lorsque le serveur étend le fichier WAR déployé dans le système de fichiers du disque local, tous les fichiers nouvellement créés seront perdus lors d'un redéploiement ou même d'un simple redémarrage, simplement parce que ces nouveaux fichiers ne font pas partie du fichier WAR d'origine.
Il n'a pas d' importance pour moi ou quelqu'un d' autre où exactement sur le système de fichiers du disque local , il sera sauvegardé, aussi longtemps que vous ne ne jamais utiliser la getRealPath()
méthode . L'utilisation de cette méthode est en tout cas alarmante.
Le chemin vers l'emplacement de stockage peut à son tour être défini de plusieurs manières. Vous devez tout faire par vous-même . C'est peut-être là que votre confusion est causée parce que vous vous attendiez d'une manière ou d'une autre à ce que le serveur fasse tout cela automatiquement. Veuillez noter que @MultipartConfig(location)
cela ne spécifie pas la destination finale du téléchargement, mais que l'emplacement de stockage temporaire pour la taille du fichier de cas dépasse le seuil de stockage de la mémoire.
Ainsi, le chemin d'accès à l'emplacement de stockage final peut être défini de l'une des manières suivantes:
Codé en dur:
File uploads = new File("/path/to/uploads");
Variable d'environnement via SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argument VM lors du démarrage du serveur via -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
entrée de fichier comme upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
avec nom upload.location
et valeur /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Le cas échéant, utilisez l'emplacement fourni par le serveur, par exemple dans JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
Dans tous les cas, vous pouvez facilement référencer et enregistrer le fichier comme suit:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Ou, lorsque vous souhaitez générer automatiquement un nom de fichier unique pour empêcher les utilisateurs d'écraser les fichiers existants avec le même nom par hasard:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Comment obtenir part
dans JSP / Servlet est répondu dans Comment télécharger des fichiers sur le serveur à l'aide de JSP / Servlet? et comment obtenir part
dans JSF est répondu dans Comment télécharger un fichier en utilisant JSF 2.2 <h: inputFile>? Où est le fichier enregistré?
Remarque: ne pas utiliser Part#write()
car il interprète le chemin relatif à l'emplacement de stockage temporaire défini dans @MultipartConfig(location)
.
Voir également: