2010-05-16 3 views
2

Étant donné un objet X; Je veux que cet objet ait une image. L'image doit être stockée dans la base de données. Je ne peux pas stocker le chemin, l'image réelle doit être dans la base de données.Comment enregistrer, récupérer et dessiner une image dans une application web en utilisant Java et PostgreSQL?

Ma question peut être répondue en répondant aux sous-questions suivantes:

a). Quel type de champ dois-je mettre dans la base de données? (par exemple, VARCHAR)

b) Quel type d'objet dois-je utiliser pour stocker et manipuler l'image (au niveau d'une couche d'objet)? (par exemple, java.awt.Image)

c) Comment créer un objet du type sélectionné (réponse à la question b) à partir des données provenant de la base de données?

d) Comment sauvegarder un objet du type sélectionné (réponse à la question b) dans la base de données?

e) Comment puis-je dessiner l'image sur une page Web? J'utilise PostgreSQL, Java et c'est une application web.

Merci!

+0

Étape 1: Ne stockez pas d'images dans votre base de données. C'est à ça que servent les systèmes de fichiers. –

+0

Oui, je sais. J'ai vérifié et tout le monde dit de ne pas le stocker dans la base de données, mais c'est un projet d'école et on me demande de le faire. Merci! –

+0

stocker des images dans la base de données est très bien, et il peut simplifier votre plan de sauvegarde/restauration si tous vos oeufs sont dans le même panier. Cela dit, si vous utilisez cette base de données pour sauvegarder des images via HTTP, vous voulez une sorte de cache en dehors de la base de données. – araqnid

Répondre

5

a) Quel type de champ dois-je mettre dans la base de données? (par exemple, VARCHAR)

Une image est une donnée binaire. Utilisez simplement un champ binaire. Dans PostgreSQL, c'est bytea.

b) Quel type d'objet dois-je utiliser pour stocker et manipuler l'image (à un calque d'objet)? (Par exemple java.awt.Image)

Utiliser un InputStream ou byte[] pour le stocker. L'API Java 2D a des classes/méthodes qui peuvent prendre/retourner l'un ou l'autre de ces types.

c) Comment créer un objet du type sélectionné (réponse à la question b) à partir des données provenant de la base de données?

Utilisez ResultSet#getBinaryStream() pour obtenir un InputStream de celui-ci ou ResultSet#getBytes() pour obtenir un byte[] de celui-ci.

d) Comment sauvegarder un objet du type sélectionné (réponse à la question b) dans la base de données?

Utilisez PreparedStatement#setBinaryStream() ou PreparedStatement#setBytes(). Remarque: si vous êtes nouveau sur JDBC/PreparedStatement, je vous recommande de passer par le Sun basic JDBC tutorial.

e) Comment puis-je dessiner l'image sur une page Web?

Utilisez un élément HTML <img> dont src pointe vers une URL correspondant à la url-pattern d'un Servlet. Vous pouvez transmettre l'identificateur d'image en tant que paramètre de requête ou pathinfo.À l'intérieur du Servlet vous venez d'écrire le InputStream obtenu à la OutputStream de la réponse de la façon habituelle Java IO. Vous pouvez trouver un exemple de code dans this answer que j'ai posté il y a quelque temps.


Cela dit, le stockage seulement images brutes dans une base de données est généralement pas une bonne idée. Vous devez également stocker certaines métadonnées, telles que content type (par exemple, image/jpeg, image/gif, etc), dont vous avez besoin dans l'en-tête de réponse pour que le navigateur sache quoi faire.

+0

Réponse brillante. Très bien – Timothy

+0

Bien expliqué ... Merci –

Questions connexes