Stockez-le n'importe où dans un endroit accessible sauf du dossier de projet de l'IDE vers le dossier de déploiement du serveur, pour les raisons mentionnées dans la réponse à la question suivante L'image téléchargée n'est disponible qu'après avoir rafraîchi la page :
-
Les modifications apportées au dossier de projet de l'IDE ne sont pas immédiatement répercutées dans le dossier de travail du serveur. Il y a une sorte de tâche de fond dans l'IDE qui s'occupe de synchroniser le dossier de travail du serveur avec les dernières mises à jour (en termes d'IDE, cela s'appelle "publication"). C'est la principale cause du problème que vous rencontrez.
-
Dans le code du monde réel, il existe des circonstances où le stockage des fichiers téléchargés dans le dossier de déploiement de la webapp ne fonctionne pas du tout. Certains serveurs (par défaut ou par configuration) ne développent pas le fichier WAR déployé dans le système de fichiers du disque local, mais entièrement dans la mémoire. Vous ne pouvez pas créer de nouveaux fichiers dans la mémoire sans modifier 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.
Peu importe pour moi ou pour quiconque l'endroit exact du système de fichiers du disque local où il sera sauvegardé, tant que vous faire no jamais utilisé getRealPath()
méthode . L'utilisation de cette méthode est en tout cas alarmant.
Le chemin vers l'emplacement de stockage peut à son tour être défini de plusieurs façons. Vous devez faire tout cela en vous-même . C'est peut-être là que se situe votre confusion, car vous vous attendiez à ce que le serveur fasse tout cela automatiquement. Veuillez noter que @MultipartConfig(location)
fait no spécifier la destination finale du téléchargement, mais l'emplacement de stockage temporaire pour le cas où la taille du fichier dépasse le seuil de stockage en mémoire.
Ainsi, le chemin vers l'emplacement de stockage final peut être défini de l'une des manières suivantes :
-
Hardcoded :
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 de la VM lors du démarrage du serveur via -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
-
*.properties
l'entrée du fichier en tant que upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
-
web.xml
<context-param>
avec le nom upload.location
et la valeur /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
-
S'il y en a, 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 des fichiers existants portant par coïncidence le même nom :
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 vers le serveur en utilisant 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ù se trouve le fichier sauvegardé ?
Note : ne no utiliser Part#write()
car il interprète le chemin d'accès relatif à l'emplacement de stockage temporaire défini dans le fichier @MultipartConfig(location)
. Assurez-vous également que vous n'êtes pas en train de corrompre des fichiers binaires tels que des fichiers PDF ou des fichiers d'images en convertissant des octets en caractères pendant la lecture/écriture en utilisant de manière incorrecte un fichier de type Reader
/ Writer
au lieu de InputStream
/ OutputStream
.
Voir aussi :