Charger des images à partir de l'extérieur de webapps / webcontext / dossier de déploiement à l'aide de <h:graphicImage> ou <img> tag
J'ai besoin d'afficher des images qui résident à l'extérieur du dossier de déploiement d'applications web à l'aide de JSF <h:graphicimage>
balise HTML ou <img>
tag. Comment puis-je y parvenir?
Vous devez vous connecter pour publier un commentaire.
Au point, il doit être accessible par une URL publique. Ainsi, la
<img src>
fin de compte, doivent consulter unhttp://
URI, pas quelque chose comme unfile://
URI ou donc. En fin de compte, la source HTML est exécutée à l'utilisateur final de la machine et les images sont téléchargées individuellement par le navigateur lors de l'analyse de la source HTML. Lorsque le navigateur rencontre unefile://
URI commeC:\path\to\image.png
, puis il va chercher de l'utilisateur final dans les propres locaux de disque système de fichiers de l'image au lieu du serveur web de l'un. Ce n'est évidemment pas d'aller travailler si le webbrowser s'exécute à un physiquement autre machine que le serveur web.Il y a plusieurs façons d'y parvenir:
Si vous avez le plein contrôle sur le dossier d'images, puis il suffit de déposer le dossier avec toutes les images, par exemple,
/images
directement dans servletcontainer du dossier de déploiement, tels que la/webapps
dossier en cas de Tomcat et/domains/domain1/applications
dossier en cas de GlassFish. Aucune configuration supplémentaire n'est nécessaire.Ou ajouter une nouvelle webapp contexte pour le serveur, ce qui souligne l'absolue de disque système de fichiers de l'emplacement du dossier, avec ces images. La façon de le faire dépend du récipient utilisé. Les exemples ci-dessous supposent que les images se trouvent dans
/path/to/images
et que vous souhaitez y accéder via http://.../images.En cas de Tomcat, ajouter la nouvelle entrée suivante à Tomcat
/conf/server.xml
à l'intérieur de<Host>
:En cas de GlassFish, ajoutez l'entrée suivante à
/WEB-INF/glassfish-web.xml
:En cas de WildFly, ajoutez l'entrée suivante à l'intérieur de
<host name="default-host">
de/standalone/configuration/standalone.xml
...... et plus bas dans
<handlers>
entrée de la même<subsystem>
comme ci-dessus<location>
:Ou, créer un
Servlet
qui diffuse l'image à partir du disque de réponse:Si vous arrive d'utiliser OmniFaces, puis le
FileServlet
peut être utile, car elle tient compte également de la tête, la mise en cache et les demandes de plage.Ou, utiliser OmniFaces
<o:graphicImage>
qui prend en charge un haricot propriété de retourbyte[]
ouInputStream
:Ou, utiliser PrimeFaces
<p:graphicImage>
qui prend en charge une méthode d'haricot retour PrimeFaces spécifiquesStreamedContent
.Pour le premier et le Tomcat et WildFly approches dans la deuxième méthode, les images seront disponibles par http://example.com/images/filename.ext et donc referencable en HTML comme suit
Pour GlassFish approche dans la deuxième voie et de la troisième voie, les images seront disponibles par http://example.com/context/images/filename.ext et donc referencable en HTML comme suit
ou en JSF comme suit (chemin de contexte est automatiquement ajouté)
Pour la OmniFaces approche de la quatrième voie, la référence comme suit
Pour la PrimeFaces approche dans le cinquième moyen, de référence comme suit:
Noter que l'exemple
#{bean}
est@ApplicationScoped
qu'il représente essentiellement un apatride service. Vous pouvez aussi le faire@RequestScoped
, mais alors la fève serait recréé à chaque requête, pour rien. Vous ne pouvez pas faire@ViewScoped
, car pour le moment, le navigateur doit télécharger l'image, le serveur n'est pas de créer une page JSF. Vous pouvez le faire@SessionScoped
, mais il est alors enregistré dans la mémoire, pour rien.Voir aussi:
h:graphicImage
, mais untouched par le futur projet de redéploiement. Si non, alors votre 2ème méthode de création d'un nouveau contexte viadocBase
son génial, mais où dois-je les mettre. Je suis à l'aide de Glassfish, dois-je les mettre dans web.xml?sun-web.xml
. marceble.com/2009/07/virtual-directories-in-glassfish/Users/KingdomHeart/resources/scholar/network/1.jpg
. Donc je l'ai mis dans mon sun-web.xml la suite<property name=”networkDocroot″ value=”from=/network/* dir=/Users/KingdomHeart/resources/scholar/” />
. Comment puis-je accéder à l'image par h:graphicImage. J'essaie<h:graphicImage value="/network/1.jpg" />
, mais pas de chance.localhost:8080/myproject-war/network/1.jpg
. Comme ça maintenant, je ne peux pas(alternatedocroot_1, alternatedocroot_2 ...)
. Il travail maintenant. Merciweb.xml
.jboss.server.data.dir
est toujours le même.server.xml
dans l'Éclipse du Serveurs projet à la place.Afin de réaliser ce que vous avez besoin de l'aide de
<h:graphicImage>
ou<img>
balises, vous avez besoin pour créer un Tomcat v7 alias pour une carte le chemin externe à votre application web du contexte.Pour ce faire, vous aurez besoin de spécifier votre application web du contexte. Le plus simple serait de définir un META-INF/context.xml fichier avec le contenu suivant:
Puis après le redémarrage de votre serveur Tomcat, vous pouvez accéder à vos fichiers d'images à l'aide de
<h:graphicImage
> ou<img>
des balises comme suit:ou
*Remarque le chemin de contexte est nécessaire pour le tag, mais pas pour le
Une autre approche possible si vous n'avez pas besoin que les images soient disponibles par le biais de méthode HTTP GET, qui pourrait être d'utiliser Primefaces
<p:fileDownload>
tag (à l'aide de commandLink ou bouton de commande tags - méthode HTTP POST).Dans votre Facelet:
Dans votre bean:
Dans PrimeFaces vous pouvez mettre en œuvre votre fève de cette façon:
Dans votre code HTML Facelet:
Je suggère de définir l'attribut cache="false" dans le graphicImage composant.
En JSP
Paquets sont
com.sun.jersey.core.util.Base64
,java.nio.file.Paths
etjava.nio.file.Files
.