J'ai lu ici qu'il ne faut de toute façon pas enregistrer le fichier sur le serveur car il n'est pas portable, transactionnel et nécessite des paramètres externes. Cependant, étant donné que j'ai besoin d'une solution tmp pour tomcat (7) et que j'ai un contrôle (relatif) sur la machine serveur, je veux savoir:
Quel est le meilleur endroit pour enregistrer le fichier? Dois-je l'enregistrer dans
/WEB-INF/uploads
(déconseillé ici ) ou quelque part sous$CATALINA_BASE
(voir ici ) ou ...? Le didacticiel JavaEE 6 obtient le chemin d'accès de l'utilisateur (: wtf :). NB: Le fichier ne doit en aucun cas être téléchargeable.Dois-je configurer un paramètre de configuration comme détaillé ici ? J'apprécierais un peu de code (je préfère lui donner un chemin relatif - donc c'est au moins Tomcat portable) -
Part.write()
semble prometteur - mais a apparemment besoin d'un chemin absoluJe serais intéressé par une exposition des inconvénients de cette approche par rapport à une base de données / référentiel JCR
Malheureusement , le FileServlet par @BalusC se concentre sur le téléchargement de fichiers, tandis que sa réponse sur les fichiers de la partie téléchargement des saute sur l' endroit où enregistrer le fichier.
Une solution facilement convertible pour utiliser une implémentation DB ou JCR (comme jackrabbit ) serait préférable.
la source
Réponses:
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 :
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:
Variable d'environnement via
SET UPLOAD_LOCATION=/path/to/uploads
:Argument VM lors du démarrage du serveur via
-Dupload.location="/path/to/uploads"
:*.properties
entrée de fichier commeupload.location=/path/to/uploads
:web.xml
<context-param>
avec nomupload.location
et valeur/path/to/uploads
:Le cas échéant, utilisez l'emplacement fourni par le serveur, par exemple dans JBoss AS / WildFly :
Dans tous les cas, vous pouvez facilement référencer et enregistrer le fichier comme suit:
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:
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 obtenirpart
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:
la source
@MultipartConfig(location)
spécifie l' emplacement de stockage temporaire que le serveur doit utiliser lorsque la taille du fichier dépasse le seuil de stockage de la mémoire, et non l'emplacement de stockage permanent où vous souhaitez finalement qu'il soit stocké. Cette valeur correspond par défaut au chemin identifié par lajava.io.tmpdir
propriété système. Voir aussi cette réponse associée à une tentative JSF ayant échoué: stackoverflow.com/questions/18478154/…Part.write
>> Cela permet à une implémentation particulière d'utiliser, par exemple, le changement de nom de fichier, lorsque cela est possible, plutôt que de copier toutes les données sous-jacentes, obtenant ainsi un avantage significatif en termes de performances en conjonction avec certains La méthode inconnue "cut" (vs copy) de disons que certaines lib apache me sauveraient les tracas d'écrire les octets moi-même - et de recréer un fichier déjà là (voir aussi ici )Part#write()
. J'ai mis à jour la réponse avec."jboss.server.data.dir"
?Je poste ma dernière façon de le faire en fonction de la réponse acceptée:
où :
et le /WEB-INF/app.properties:
HTH et si vous trouvez un bug, faites le moi savoir
la source