Question

J'ai développé une application Web Java EE. Cette application permet à un utilisateur de télécharger un fichier avec l'aide d'un navigateur. Une fois que l'utilisateur a téléchargé son dossier, cette application premier va enregistrer le fichier sur le serveur (sur lequel il est en cours d'exécution) et traite ensuite.

À l'heure actuelle, je stocke le fichier sur le serveur comme suit:

try {
    // formFile represents the uploaded file
    FormFile formFile = programForm.getTheFile();
    String path = getServlet().getServletContext().getRealPath("") + "/"
        + formFile.getFileName();
    System.out.println(path);
    file = new File(path);
    outputStream = new FileOutputStream(file);
    outputStream.write(formFile.getFileData());
}

où, le formFile représente le fichier uploadé.

Maintenant, le problème est qu'il fonctionne très bien sur certains serveurs, mais sur certains serveurs le getServlet().getServletContext().getRealPath("") revient null de sorte que le chemin final que je reçois est null/filename et le fichier ne stocke pas sur le serveur.

Quand je vérifié l'API pour ServletContext.getRealPath() méthode, je l'ai trouvé ce qui suit:

  

public java.lang.String getRealPath(java.lang.String path)

     

Retourne une chaîne contenant le chemin réel pour un chemin virtuel donné. Par exemple, le chemin "/index.html" renvoie le chemin absolu du fichier sur le système de fichiers du serveur serait servi par une demande de "http://host/contextPath/index.html", où contextPath est le chemin du contexte de cette ServletContext.

     

Le chemin réel retourné sera sous une forme appropriée pour le système informatique et d'exploitation sur lequel le conteneur de servlet est en cours d'exécution, y compris les séparateurs de chemin appropriés. Cette méthode renvoie null si le conteneur de servlet ne peut pas traduire le chemin virtuel vers un chemin réel pour une raison quelconque (par exemple lorsque le contenu est mis à la disposition d'une archive .war).

Alors, est-il un autre moyen par lequel je peux stocker des fichiers sur les serveurs aussi qui revient null pour getServlet().getServletContext().getRealPath("")

Était-ce utile?

La solution

L'écriture au système de fichiers à partir d'un conteneur Java EE est pas vraiment recommandé, surtout si vous avez besoin pour traiter les données écrites:

  • il est pas transactionnel
  • il nuit à la portabilité (si vous êtes dans un environnement en cluster)
  • il faut des paramètres externes de configuration pour l'emplacement cible

Si cela est une option, je stocke les fichiers dans la base de données ou utiliser un référentiel JCR (comme Jackrabbit ).

Autres conseils

Par spécification, le seul « vrai » chemin vous êtes assuré d'obtenir former un conteneur de servlet est un répertoire temporaire.

Vous pouvez obtenir ce via le ServletContext.gerAttribute("javax.servlet.context.tempdir"). Cependant, ces fichiers ne sont pas visibles dans le contexte Web (par exemple, vous ne pouvez pas publier une URL simple pour fournir ces fichiers), et les fichiers ne bénéficie d'aucune garantie de survivre à un redémarrage de l'application Web ou un serveur.

Si vous avez simplement besoin d'un endroit pour stocker un fichier de travail pendant une courte période, alors ce sera bien de travail pour vous.

Si vous avez vraiment besoin d'un répertoire, vous pouvez en faire un paramètre de configuration (soit une variable d'environnement, une propriété Java (c.-à-java -Dyour.file.here=/tmp/files ...), un paramètre de contexte ensemble dans le web.xml, un paramètre de configuration stockée dans votre base de données via un formulaire web, etc.). Ensuite, il est à l'deployer de mettre en place ce répertoire pour vous.

Toutefois, si vous devez réellement servir plus tard jusqu'à ce fichier, vous aurez soit besoin d'un mécanisme spécifique de conteneur pour « monter » répertoires externes à votre application Web (Glassfish comme « racines alternatives doc », d'autres ont des concepts similaires), ou vous devrez écrire un servlet / filtre pour servir à l'extérieur du magasin de fichiers de votre application web. Cette FileServlet est tout à fait complet, et que vous pouvez voir, créer votre propre, alors pas difficile, n'est pas trivial de le faire correctement.

Modifier

L'essentiel de base est la même, mais plutôt que d'utiliser « getRealPath », utilisez simplement « getInitParameter ».

String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;

Et sur votre chemin.

Modifier à nouveau:

En ce qui concerne le contenu du chemin, je lui donnerais un chemin absolu. Dans le cas contraire, vous devez savoir où le serveur d'application définit son chemin par défaut au cours exeuction, et chaque serveur d'application peut bien utiliser des répertoires différents. Par exemple, je crois que le répertoire de travail pour Glassfish est le répertoire de configuration du domaine de fonctionnement. Pas un choix particulièrement évident.

Alors, utilisez un chemin absolu, très certainement. De cette façon, vous savez où les fichiers vont, et vous pouvez contrôler les droits d'accès au niveau du système d'exploitation pour ce répertoire, si cela est nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top