J'ai un léger problème avec ma JSP. Je voudrais y afficher une image, provenant de ma BDD oracle.
Voic comment je récupères l'image :
InputStream in = rs.getBinaryStream("PHOTO_HOLDER");
if (in != null) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((in.read()) > -1) {
out.write(in.read());
}
ecd.setPhoto(out.toByteArray());
in.close();
}
A savoir que le champ PHOTO_HOLDER est de type LONGRAW (et je ne peux pas changer ça).
Depuis une JSP j'avais du mal à visualiser à vrai dire. Étant donné que response ne peut avoir qu'un seul type (soit du texte, soit du binaire, mais pas un mélange des deux) , je comprends la séparation du traitement de l'image avec le reste du code, et la présence d'une servlet dédiée à la création de l'image, mais je ne vois pas vraiment bien comment ça se goupille au final.
J'ai vu des exemples de gars qui le faisaient à partir d'une JSP plutôt qu'à partir d'une servlet, et qui avaient dans leur page finale un lien du type <imgsrc="image.jsp">, mais ce que tu fais là semble plus propre.
Bref, je continue à chercher, mais a priori pour moi ce que tu fais devrait marcher.
D'ailleurs au sujet de ton problème, quel est le rendu final ? Que contient le code source de ta page HTML au niveau du tag <img> ? A part l'image, tout le reste de la page s'affiche correctement ?
Oui, le reste de la page s'affiche bien. Simplement, j'ai l'icne "d'image cassée" qu'on a quand l'image n'est pas trouvée. Et si je clique dessus et que je mets "voir l'image",ça me dit "The image “https://... cannot be displayed because it contains errors"
Oui, j'ai commencé par un bête o.write(photo); et tenté par la suite o.write(photo, 0, photo.length); au cas où, sans grand espoir, et sans résultat...
Je n'ai pas le temps aujourd'hui d'y regarder de plus près. Il faudrait être certain de bien cerner d'où vient le problème : actuellement on ne sait pas si c'est la manière dont tu récupères l'image depuis ta BDD qui pose problème, ou la manière dont tu passes le tout dans la réponss HTTP.
Si tu as chrome, essaie de regarder ce que te renvoie le serveur quand tu demandes l'images (dans les outils de developpement, Dans network, tu peux voir la liste des éléments chargés. En cliquant dessus tu auras plus d'info sur ce que tu reçois du serveur (headers http, taille, etc)
Si tu as firefox, il y a des plugins genre webdevelopper ou firebug qui te permettront de le faire.
Quant au coup de debug dans le code. C'est fait, je constate que j'ai bien un array de bytes, qu'il a l'air rempli, que je passe bien par l'action qui mets ce flux dans la reponse. Que puis vérifier d'autre ?
mmmh bizarre pour firebug ... Tu as bien utilisé l'onglet réseau ?
Sinon essaie avec chrome, c'est plus complet apparemment, et ça te permet d avoir la réponse directement, pas juste les headers (une exception renvoyée sous forme de texte alors que le browser attend une image ?)
"Resource interpreted as Image but transferred with MIME type text/html."
Bizarre, je mets pourtant bien response.setContentType("image/jpeg");
PS : heu non, pas du tout, je sais même pas ce que c'est...
EDIT : bon, j'ai réussi à faire en sorte que le type Mime soit bien jpeg avec response.addHeader("Content-type", "image/jpeg");
Donc, je n'ai plus de warning dans chrome, par contre la photo s'affiche toujours pas. Et quand j'inspecte un peu, je constate que mes headers ont l'air correcte (longueur, content-type OK). Par contre, "this request has no response available". Or, la réponse, c'est bien là qu'en principe j'ai envoyé mon array de bytes. Donc comment se fait-il que ce soit vide ???
Depuis ton IDE, quand tu te mets en mode debug sur le ServletOutputStream (l'objet "o"), si tu poses un breakpoint sur la ligne du flush, que contient-il à ce moment lors de l'exécution, juste après le o.write() ?
[Edit] au sujet des en-têtes, histoire ne rien laisser de côté, sur le lien que je t'ai proposé le gars procède ainsi (à adapter avec ton code):
J'avais fait quelque chose de similaire. Curieusement, ça marchait sans que j'ai eu besoin de définir le type MIME.
Souvent, le type est automatiquement définit avec le premier contenu envoyer. Attention à ne pas envoyer de chaines de caractère juste avant l'image.
Voilà ma fonction
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletOutputStream output = resp.getOutputStream();
// Je recupère mon image à partir d'un fichier (classe java.awt.Image )
Image img = ...
// On crée un buffer d'image, c'est lui qui sera envoyé au navigateur
BufferedImage bufferImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
// On remplis le buffer en ressinant le contenu de l'image
Graphics2D g = bufferImage.createGraphics();
g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
g.dispose();
// On écrit le contenu du buffer dans le canal de sorti
ImageIO.write(bufferImage, "JPEG", output);
output.flush();
output.close();
}
A adapter suivant tes besoin. Le tout est de savoir remplir le BufferedImage
Et cela me renvoie une ImageFormatException : Not a JPEG file: starts with 0xd8 0xe0
Il semblerait donc qu'il y ait bien un problème au niveau de la récupération de mes données...
Bon, une idée vient de me venir en rédigeant, je pars tester, j'éditerai au besoin.
EDIT: WOUHOUUUUU !!! Ca y est !!!
C'était bien un problème de récupération d'image, et un problème bien bien débile en plus. Comme quoi, le copier-coller, c'est le mal, on le dira jamais assez !
En faisant ceci, je récupérais un byte sur 2 (vu qu'il y avait 2 in.read(), un seul pris en compte)
InputStream in = rs.getBinaryStream("PHOTO_HOLDER");
if (in != null) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((in.read()) > -1) {
out.write(in.read());
}
ecd.setPhoto(out.toByteArray());
in.close();
}
J'ai donc bêtement remplacé par ceci :
if (in != null) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int bytePhoto;
while ((bytePhoto = in.read()) > -1) {
out.write(bytePhoto);
}
ecd.setPhoto(out.toByteArray());
in.close();
}
bonjour je suis débutant en java EE voici mon controller je voudrais savoir comment afficher récuperer un champs de type input type="file" dans cette servlet .j'ai poster un code jsp qui est categorie.jsp donc voici le controller aidez svp package gn.niit.infos.custapp.controller;
/** * * @author Diamant */ public class AjouterCategory extends HttpServlet { private static final long serialVersionUID = 1L; /*injection de notre EJB*/ @EJB
CustAccountRemoteBean ma_dao; public static final int Taille_tampon = 1024; public static final String Chemin_Fichier = "/Mateo/file/img/";
// // //on recupere champ du fichier // Part part = req.getParameter("file"); // /*on verifie qu'on bien recu un fichier*/ // String NomPhoto = getNomPhoto(part); // //si on a bien un fichier avec une condition if // // Si on a bien un fichier // if (nomPhoto != null && !nomPhoto.isEmpty()) { // String photo = part.getName(); // // Corrige un bug du fonctionnement de firefox // NomPhoto = NomPhoto.substring(nomPhoto.lastIndexOf('/') + 1) // .substring(nomPhoto.lastIndexOf('\\') + 1); // // // On écrit définitivement le fichier sur le disque // writeFile(part, nomPhoto, CHEMIN_FICHIERS); // // //req.setAttribute(nomPhoto, nomPhoto); // } // // this.getServletContext().getRequestDispatcher("categorie.jsp").forward(req, resp); // } // // private void writeFile(Part part, String nomPhoto, String chemin) throws IOException { // BufferedInputStream bis = null; // BufferedOutputStream bos = null; // //int Taille_tampon = 10240; // try { // bis = new BufferedInputStream(part.getInputStream(), 1024); // bos = new BufferedOutputStream(new FileOutputStream(new File(chemin + nomPhoto)), 1024); // // byte[] photo = new byte[1024]; // int longueur; // while ((longueur = bis.read(photo)) > 0) { // bos.write(photo, 0, longueur); // } // } finally { // try { // bos.close(); // } catch (IOException e) { // // } // try { // bis.close(); // } catch (IOException e) { // // } // } // } // // private static String getNomPhoto(Part part) { // for (String contentDisposition : part.getHeader("content-disposition").split(";")) { // if (contentDisposition.trim().startsWith("filename")) { // return contentDisposition.substring(contentDisposition.indexOf('=') + 1).trim().replace("\"", ""); // } // } // return null; }
}
[J2EE - JSP]Afficher une image (byte[]) dans une JSP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !
Tutoriel complet MySQL !