140 votes

Manière la plus simple de servir des données statiques depuis en dehors du serveur d’application dans une application de web Java

J'ai une application web Java, à l'aide de Spring et Struts, en cours d'exécution sur Tomcat 5.5. Je veux charger des images statiques, qui sera montré à la fois sur l'INTERFACE Web et dans les fichiers PDF générés par l'application. Aussi de nouvelles images seront ajoutées et sauvé par téléchargement via l'INTERFACE Web.

Ce n'est pas un problème de le faire en ayant la statique des données stockées dans le conteneur web mais le stockage et le chargement de l'extérieur du conteneur web est de me donner des maux de tête.

Je préfère ne pas utiliser un autre serveur web comme Apache pour servir les données statiques à ce point. Je n'aime pas l'idée de stocker les images en binaire dans une base de données.

J'ai vu quelques suggestions comme ayant le répertoire de l'image d'être un lien symbolique pointant vers un répertoire en dehors du conteneur web, mais cette approche vous permettra de travailler à la fois sur Windows et *nix environnements?

Certains suggèrent que l'écriture d'un filtre ou d'une servlet pour la manipulation de l'image de servir, mais ces suggestions ont été très vagues et de haut niveau sans pointeurs vers des informations plus détaillées sur la façon d'accomplir ceci.

175voto

BalusC Points 498232

J'ai vu quelques suggestions comme ayant le répertoire de l'image d'être un lien symbolique pointant vers un répertoire en dehors du conteneur web, mais cette approche vous permettra de travailler à la fois sur Windows et *nix environnements?

Si vous respectez les *nix système de fichiers règles de chemin d'accès (par exemple, /path/to/images), il fonctionne sur Windows. Toutefois, il serait seulement être analysé sur le même disque que d'où cette commande est invoquée. Donc, si Tomcat est par exemple installé sur C: puis le chemin d'accès serait en fait le point de C:/path/to/images.

Si les images sont toutes situées à l'extérieur de la webapp et vous voulez avoir de Tomcat DefaultServlet pour les traiter, puis tout ce que vous devez faire dans Tomcat est d'ajouter les éléments suivants élément de Contexte, d' /conf/server.xml à l'intérieur d' <Host> balise:

<Context docBase="/path/to/images" path="/images" />

De cette façon, ils seront accessibles par le biais http://example.com/images/....

Si vous voulez avoir le contrôle sur la lecture/écriture des images de vous-même, alors vous avez besoin pour créer un Servlet pour ce qui est fondamentalement juste obtient un InputStream de l'image dans la saveur, par exemple, FileInputStream et l'écrit à l' OutputStream de la HttpServletResponse. Importantingly, vous devez définir l' Content-Type - tête de réponse ainsi et aussi, de préférence l' Content-Length et Content-Disposition.

Voici un exemple de base de cette servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
    String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
    File file = new File("/path/to/images", filename);
    response.setHeader("Content-Type", getServletContext().getMimetype(filename));
    response.setHeader("Content-Length", String.valueOf(file.length()));
    response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
    Files.copy(file.toPath(), response.getOutputStream());
}

La carte sur un url-pattern de par exemple /images/* et ensuite vous pouvez l'appeler en http://example.com/images/filename.jpg. De cette façon, vous pouvez avoir plus de contrôle sur les demandes de l' DefaultServlet n', tels que la fourniture d'une image par défaut (c'est à dire if (!file.exists()) file = new File("/path/to/images", "404.gif") ). Aussi à l'aide de l' request.getPathInfo() est préféré au-dessus de request.getParameter() parce qu'il est plus SEO friendly et sinon IE de ne pas choisir le bon nom de fichier lors de l'Enregistrer en tant Que.

Vous pouvez trouver ici un exemple complet d'un FileServlet compatible avec à peu près tous les efficientness qui HTTP fournit (mise en cache, de reprendre, de gzip).

Espérons que cette aide.

9voto

Bozho Points 273663

Vous pouvez le faire en mettant vos images sur un chemin fixe (par exemple: /var/images, ou c:\images), ajouter un paramètre dans vos paramètres de l'application (représenté dans mon exemple, par le Settings.class), et de les charger comme ça, dans un HttpServlet de la vôtre:

String filename = Settings.getValue("images.path") + request.getParameter("imageName")
FileInputStream fis = new FileInputStream(filename);

int b = 0;
while ((b = fis.read()) != -1) {
        response.getOutputStream().write(b);
}

Ou si vous voulez manipuler l'image:

String filename = Settings.getValue("images.path") + request.getParameter("imageName")
File imageFile = new File(filename);
BufferedImage image = ImageIO.read(imageFile);
ImageIO.write(image, "image/png", response.getOutputStream());

ensuite le code html serait <img src="imageServlet?imageName=myimage.png" />

Bien sûr, vous devriez penser au service de différents types de contenu - "image/jpeg", par exemple basé sur l'extension de fichier. Vous devez également fournir une certaine mise en cache.

En outre, vous pouvez utiliser cette servlet pour la qualité de redimensionnement de vos images, en fournissant des paramètres largeur et hauteur en tant qu'arguments, et à l'aide de image.getScaledInstance(w, h, Image.SCALE_SMOOTH), compte tenu de la performance, bien sûr.

9voto

sbabamca Points 11

Exigence : l'Accès aux Ressources statiques (images/vidéos., etc.) à partir de l'extérieur du répertoire WEBROOT ou à partir du disque local

Étape 1 :
Créer un sous-répertoire webapps de tomcat., laissez-nous dire le nom du dossier est myproj

Étape 2 :
En vertu de myproj créer un dossier WEB-INF en vertu du présent créer un simple web.xml

code sous web.xml

<web-app>
</web-app>

Structure de répertoire pour les deux étapes ci-dessus

c:\programfile\apachesoftwarefoundation\tomcat\...\webapps
                                                            |
                                                            |---myproj
                                                            |   |
                                                            |   |---WEB-INF
                                                                |   |
                                                                    |---web.xml

Étape 3:
Maintenant, créez un fichier xml avec le nom myproj.xml sous l'emplacement suivant

c:\programfile\apachesoftwarefoundation\tomcat\conf\catalina\localhost

CODE myproj.xml:

<Context path="/myproj/images" docBase="e:/myproj/" crossContext="false" debug="0" reloadable="true" privileged="true" /> 

Étape 4:
4) Maintenant, créez un dossier avec le nom myproj dans le lecteur E de votre disque dur et de créer une nouvelle

dossier avec le nom des images et de la place des images dans le dossier images (e:myproj\images\)

Supposons myfoto.jpg est placé sous e:\myproj\images\myfoto.jpg

4 B) Maintenant, créez un dossier avec le nom de la WEB-INF en e:\myproj\WEB-INF et de créer un web.xml dans le dossier WEB-INF

Code web.xml

<web-app>
</web-app>

Étape 5:
Maintenant, créez une .document html avec le nom de index.html et de lieu dans e:\myproj

CODE sous index.html Bienvenue à Myproj

La Structure de Répertoire pour le au-dessus de l'Étape 4 et l'Étape 5 est comme suit

E:\myproj
    |--index.html
    |
    |--images
    |     |----myfoto.jpg
    |
    |--WEB-INF
    |     |--web.xml

Étape 6:
Maintenant démarrer le serveur apache tomcat

Étape 7:
ouvrez le navigateur et tapez l'url de la façon suivante

http://localhost:8080/myproj    

alors u afficher le contenu qui est fourni dans index.html

Étape 8:
Pour Accéder aux Images sous votre disque dur local (à l'extérieur de la racine de votre site)

http://localhost:8080/myproj/images/myfoto.jpg

2voto

cherouvim Points 18550

Si vous décidez d’envoyer à , vous devez également dans afin de permettre pour parcourir les liens symboliques.

Voir http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X