Serveur Tomcat absolu d'accès au fichier dans la guerre webapp
J'ai un Printemps webapp dont .war
fichier a été uploadé sur un serveur Tomcat. La plupart des fonctions de base fonctionnent comme prévu, pages vues et la soumission d'un formulaire.
Mon problème maintenant c'est que ma webapp besoin de lire et d'écrire des fichiers et je suis désemparés quant à la façon dont je peux le faire (le fichier I/O retours java.lang.NullPointerException
).
J'ai utilisé le suivant le code pour obtenir le chemin absolu d'un fichier donné suggéré par Titi Wangsa Bin Damhore à connaître le chemin d'accès relatif au serveur:
HttpSession session = request.getSession();
ServletContext sc = session.getServletContext();
String file = sc.getRealPath("src/test.arff");
logger.info("File path: " + file);
Ici est le chemin de sortie:
/home/username/tomcat/webapps/appname/src/test.arff
Mais quand j'ai vérifié le fichier de répertoire via WinSCP, le réel du fichier chemin d'accès est:
/home/username/tomcat/webapps/appname/WEB-INF/classes/test.arff
Voici mes questions:
- Comment puis-je transformer ces chemins d'accès dans quelque chose comme
C:/Users/Workspace/appname/src/test.arff
(le chemin original dans mon local de la machine qui fonctionne parfaitement)? C'est les serveurs sontApache Tomcat 6.0.35
etApache Tomcat 6.0.35
. - Pourquoi le code de retour d'un chemin d'accès différent, par opposition au chemin d'accès?
- Si le fichier I/O n'est pas applicable, quelles alternatives peut-on utiliser?
PS j'ai juste besoin de deux fichiers (< 1 MO chacun) donc je ne pense pas que j'ai peut-être besoin d'utiliser une base de données pour les contenir, comme suggéré par moins dans ce fil.
Fichier I/O
Ci-dessous le code que j'utilise pour accéder au fichier dont j'ai besoin.
BufferedWriter writer;
try {
URI uri = new URI("/test.arff");
writer = new BufferedWriter(new FileWriter(
calcModelService.getAbsolutePath() + uri));
writer.write(data.toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
OriginalL'auteur | 2013-12-05
Vous devez vous connecter pour publier un commentaire.
De lire des fichiers:
Pour écrire des fichiers:
Si vous ne souhaitez pas utiliser le tmpdir fournis par le conteneur de servlet, alors vous devriez utiliser quelque part qui est entièrement à l'extérieur de la servlet contexte de purvue, comme
/path/to/temporary/files
ou quelque chose comme ça. Vous ne voulez certainement pas à utiliser le conteneur répertoire temporaire à des fins autres que de vraiment les fichiers temporaires qui sont d'accord pour supprimer sur la re-déploiement, etc.ServletContext
mais ils ont tous l'air de faire une nouvelle classe. Comment initialiser si c'est juste pour cette classe?Le
ServletContext
est un objet qui devrait déjà être disponible pour votre servlet. Je vais laisser ça comme un exercice pour vous de savoir où le chercher. Astuce: lire la Servlet API javadoc.OriginalL'auteur Christopher Schultz
C'est une guerre, vous n'avez pas de lire/écrire des fichiers à l'intérieur.
Lecture est triviale; mettre les fichiers sur le chemin de la classe, et se lisent comme une ressource.
Vous ne devriez pas être écrit à l'intérieur d'une application web de toute façon, puisque même si elle n'était pas une guerre, les choses dans le contexte pourrait disparaître au cours d'une redéployer, elle sera peut-être sur un serveur si vous êtes en cluster, etc. Les écritures de fichiers doit vivre quelque part configurable.
/root/src/
) mais comment puis-je lire comme ressource? Dois-je les déclarer dans unxml
fichier?href="http://stackoverflow.com/q/1464291/438992">stackoverflow.com/q/1464291/438992 par exemple, même si cela est trivialement la recherche et le web en général.
Si vous vous trouvez en appelant
getRealPath
, vous le faites Mal.OriginalL'auteur Dave Newton
Moins qu'il y ait une raison quelconque vous avez réellement besoin d'un
java.io.File
, charger le fichier de chemin de classe et ne vous inquiétez pas d'où ça vient.test.arff
je viens de créer et de lire à l'aide de ce code de droit? Ce que mon autre fichier lire et est situé dans/home/username/tomcat/webapps/appname/WEB-INF/classes/mlp.model
? Comment puis-je y avoir accès?Tout ce qui finit en
classes/
, je pense, doit être dans le classpath, vous pouvez donc utiliser cette méthode. Vous ne pouvez pas écrire des fichiers de cette façon, vous ne devez vraiment voulez pour écrire dansWEB-INF
.Vous utilisez
getServletContext().getResource("/WEB-INF/classes/mlp.model")
. Lire l'API certain temps. Il fera des merveilles pour votre productivité.Pourquoi préférez-vous que le chargeur de classe?
Le
ClassLoader
aura qu'à se regarder dansWEB-INF/classes
etWEB-INF/lib/*.jar
, tout en utilisant laServletContainer
'sgetResource
méthode vous permettra de charger une ressource qui n'est pas disponible à laClassLoader
. Par exemple, vous pouvez charger/WEB-INF/config/foo.properties
qui ne serait pas possible avec leClassLoader
.OriginalL'auteur Chris Martin
J'ai utilisé le Printemps
Ressource
composant pour obtenir mon chemin d'accès au fichier comme suggéré par bâiller comme ceci (NOTEtest.arff
est situé dansroot/src
avantwar
de déploiement):Prochaine, je viens de concaténées
arff
pour les fichiers que je veux comme:J'ai utilisé
arffPath
directement là juste pour un exemple rapide, mais j'ai fait une fonction de sorte qu'il sera plus commode.Le chemin d'accès au fichier est en fait
/home/username/tomcat/webapps/bosom/WEB-INF/classes/test.arff
alors ne soyez pas peur de l'utiliser (comme je l'ai fait) juste parce que ça ne ressemble pas àC:/path/to/file
lmaoCes deux chemins d'accès aux fichiers sont les mêmes si utilisé pour obtenir un fichier ne soyez pas confus.
ClassLoader
ouServletContext
pour aller chercher des ressources est une solution plus robuste. Cette solution semble utiliser leClassLoader
mais alors mangles l'URL et les charges de la ressource à l'aide de fichier standard I/O. 🙁pourriez-vous veuillez donner un code de travail que je peux imiter s'il vous plaît?
Vous devriez probablement utiliser la
File
attribut qui peut être trouvé dans laServletContext
en vertu de la "javax.servlet.contexte.tempdir". Ou, vous devez stocker vos fichiers dans un emplacement connu entièrement à l'extérieur de l'application web (par exemple, dans/some/place/for/temp/files
).OriginalL'auteur