2008-09-29 7 views
2

Je développe une application web en utilisant Struts 2.1.2 et Hibernate 3.2.6.GA. J'ai une entité, User, que j'ai mappée à une table USERS dans la base de données en utilisant Hibernate. Je veux avoir une image associée à cette entité, que je prévois de stocker comme BLOB dans la base de données. Je veux également afficher l'image sur une page Web avec d'autres attributs du User.Comment puis-je diffuser une image sur le navigateur en utilisant Struts 2 + Hibernate 3?

La solution que je pouvais penser était d'avoir une table IMAGES(ID, IMAGE)IMAGE est une colonne BLOB. USERS aura une colonne FK appelée IMAGEID, qui pointe vers la table IMAGES. Je vais ensuite mapper une propriété sur l'entité User, appelée imageId mappée à cette IMAGEID en tant que Long. Lors du rendu de la page avec une JSP, j'ajouterais des images comme <img src="images.action?id=1"/> etc., et j'ai une action qui lit l'image et transmet le contenu au navigateur, avec les en-têtes définis pour mettre l'image en cache pendant une longue période.

Est-ce que cela fonctionnera? Existe-t-il une meilleure approche pour le rendu des images stockées dans une base de données? Est-ce que le stockage de telles images dans le DB est la bonne approche?

Répondre

4

Oui, la solution suggérée fonctionnera. Étant donné que vous travaillez dans un environnement Java, le stockage des images dans la base de données est la meilleure solution. Si vous exécutez dans un environnement de serveur unique avec un serveur d'applications qui vous permettra de déployer dans un format éclaté techniquement, vous pouvez stocker les images sur le disque, mais ce ne serait pas la meilleure pratique. Une suggestion serait d'utiliser une servlet au lieu d'une JSP. Pour obtenir un bon comportement du navigateur, vous voulez que le navigateur pense que le type de fichier affiché correspond au type de fichier attendu. Malgré l'existence d'en-têtes de type mime, l'extension de fichier est toujours très importante. Donc, vous voulez un lien qui ressemble à ceci:

<a href="foo.jsp"><img src="imageservlet/123456789.png"></a> 

Où 123456789 est la clé primaire de votre image dans la base de données. Votre mappage de servlet ressemblerait à ceci:

<servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class>com.example.ImageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ImageServlet</servlet-name> 
    <url-pattern>/imageservlet/*</url-pattern> 
</servlet-mapping> 

Ensuite, dans votre servlet Parse simplement l'URL de demande de l'ID d'image plutôt que d'utiliser la chaîne de requête comme la chaîne de requête confondra certains navigateurs.L'utilisation de la chaîne de requête ne casse pas les navigateurs, mais vous aurez un comportement étrange en ce qui concerne la mise en cache et certains navigateurs peuvent signaler que le contenu est dangereux.

+0

J'ai implémenté ceci en utilisant ce mécanisme (en utilisant une action ServletResponseAware au lieu d'une servlet). Je ne considère pas cela comme une réponse acceptée en espérant que d'autres mécanismes pourraient être mis en place. J'ai upvoted ceci, de sorte que c'est la réponse la plus connue à ce jour. –

0

Si vous souhaitez afficher directement l'image de l'utilisateur avec ses propriétés, vous pouvez peut-être envisager d'incorporer les données de l'image directement dans le code HTML.

En utilisant un ensemble de données spéciales: schéma d'URL que vous êtes en mesure d'intégrer toutes les données mime dans une page HTML, le format est le suivant:

data:<mimetype>;base64,<data> 

doit être remplacé par le mime -type de vos données (image/png par exemple) et est la chaîne codée en base64 des octets réels du fichier.

Voir RFC 2557.

Example:

<img src="data:image/png;base64,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"> 
+0

Je viens de lire que cela ne fonctionne pas avec IE, jusqu'à ce que la version 8 soit publiée. En outre, l'image n'est pas mise en cache sur le navigateur. Donc, malgré la facilité de codage, je pense que je vais utiliser mon schéma d'origine. –

+0

n'oubliez pas qu'il existe une limite (vraiment stricte) sur la longueur d'une telle chaîne. De 1k caractères à 100k selon le navigateur. –

0

Internet Explorer ne supporte pas ce style de plongement d'image.

+0

Juste testé http://rifers.org/blogs/gbevin/2005/4/11/embedding_images_inside_html avec IE7 et cela fonctionne très bien. –

+0

L'image dans la publication de Geert n'apparaît pas sur IE6/WinXP. –

0

Votre solution suggérée fonctionnerait parfaitement. J'ai fait la même chose.

Mais vous n'avez pas besoin de servlet pour cela. Struts2 a déjà un résultat de flux.

Voir ce Struts 2 Example qui décrit exactement ce que vous voulez.

Questions connexes