Question Afficher BLOB (image) via JSP


J'ai un code pour montrer un tableau o des employés.

Les données (nom, téléphone, photo, etc.) sont stockées dans SQLServer et affichées via JSP. Afficher les données est correct, sauf l'image .jpg (stockée dans la colonne IMAGE = BLOB).

Au fait, j'ai déjà l'image affichée (voir le code ci-dessous), mais je ne sais pas comment la mettre dans la zone définie dans un fichier .css (voir aussi le code ci-dessous), puisque l'image resultSet est chargé dans toute la page du navigateur.

Est-ce que quelqu'un sait comment «encadrer» l'image?

<%
Connection con = FactoryConnection_SQL_SERVER.getConnection("empCHART");
Statement stSuper = con.createStatement();
Statement stSetor = con.createStatement();

Blob image = null;
byte[] imgData = null;

ResultSet rsSuper = stSuper.executeQuery("SELECT * FROM funChart WHERE dept = 'myDept'");

if (rsSuper.next()) {
image = rsSuper.getBlob(12);
imgData = image.getBytes(1, (int) image.length());
response.setContentType("image/gif");
OutputStream o = response.getOutputStream();
//o.write(imgData); // even here we got the same as below.
//o.flush();
//o.close();

--[...]

<table style="margin: 0px; margin-top: 15px;">
<tr>
<td id="photo">
<img title="<%=rsSuper.getString("empName").trim()%>" src="<%= o.wite(imageData); o.flush(); o.close(); %>" />
</td>
</td>

<td id="empData">
<h3><%=rsSuper.getString("empName")%></h3>
<p><%=rsSuper.getString("Position")%></p>
<p>Id:<br/><%=rsSuper.getString("id")%></p>
<p>Phone:<br/><%=rsSuper.getString("Phone")%></p>
<p>E-Mail:<br/><%=rsSuper.getString("Email")%></p>
</td>
</table>

Et voici le fragment censé encadrer l'image:

#photo
{
    padding: 0px;
    vertical-align: middle;
    text-align: center;
    width: 170px;
    height: 220px;
}

Merci d'avance !


10
2018-06-25 15:12


origine


Réponses:


Vous faites des erreurs fondamentales ici. le <img src> doit pointer vers une URL, ne pas contenir le contenu binaire de l'image. Le type de contenu de la page JSP ne doit pas être défini sur image/gif. Il devrait être gardé par défaut à text/html. Il n’est pas vrai que le serveur Web est censé inclure les images concrètes dans le résultat HTML, comme vous l’avez espéré. C'est le navigateur Web qui télécharge les images individuellement en fonction de l'URL trouvée dans src attribut puis les présente en conséquence.

Le plus simple est de créer un servlet distinct qui diffuse l'image de la base de données vers le corps de la réponse. Vous pouvez identifier l'image de manière unique par un paramètre de requête ou des informations de chemin. Voici un exemple qui utilise un paramètre de requête pour cela:

<img src="imageServlet?id=<%=rsSuper.getString("id")%>" />

le doGet() méthode devrait alors fondamentalement effectuer ce travail:

String id = request.getParameter("id");

// ...

InputStream input = resultSet.getBinaryStream("imageColumnName");
OutputStream output = response.getOutputStream();
response.setContentType("image/gif");
// Now write input to output the usual way.

Sans rapport au problème concret, en utilisant scriptlets cette façon est officiellement découragée depuis une décennie. Peut-être que vous lisiez des livres / didacticiels complètement obsolètes ou gérez une ancienne application Web JSP. Pour quelques idées, consultez également les réponses aux questions suivantes pour quelques conseils:


17
2018-06-25 15:17



Si vous souhaitez afficher l'image via une balise HTML, vous devrez pointer l'image sur une ressource du serveur qui charge l'image, afin que le navigateur client puisse le charger. De cette façon, vous pouvez styler le <img /> marque.

Pour ce faire, la plupart des gens écrivent un ImageServlet qui charge les données binaires de l'image et écrit un <img src = "/source/to/someImageServlet?id=<%=rsSuper.getString("id")%>" id = "photo"/>.


2
2018-06-25 15:17



  Connection con = new DBConnection().getConnection();
        String sql = " SELECT * FROM tea ";
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            byte[] imgData = rs.getBytes("img"); // blob field 
            request.setAttribute("rvi", "Ravinath");
            rs.getString("teatitle");

            String encode = Base64.getEncoder().encodeToString(imgData);
            request.setAttribute("imgBase", encode);
        }

alors utilisé jstl pour extraire des attributs sur la page jsp

 <img src="data:image/jpeg;base64,${imgBase}" />

0
2017-12-07 09:41



//globle variable
List listmap = new ArrayList();//with getter/setter

//method
Connection con = conn.getConnection();
PreparedStatement ps = null;
String query="select img from tablename";
ps = con.prepareStatement(query);
resultSet = ps.executeQuery();
while (resultSet.next()) {
PackagePojo p1=new PackagePojo();
// pojo class with field private String imagePath with getter/setter;
byte[] img = resultSet.getBytes("PTOIMAGE");//PTOIMAGE db column name
String encode=Base64.encodeBase64String(img );
p1.setImagePath(encode);
listmap.add(p1);
}

//in jsp with struts2

<s:iterator value="listmap">
<img src="data:image/jpeg;base64,${imagePath}" alt="bhudutt" title="bhudutt" />
</s:iterator>

0
2018-03-23 05:29