MySQL 中的 BLOB 未正确显示

Posted

技术标签:

【中文标题】MySQL 中的 BLOB 未正确显示【英文标题】:BLOB from MySQL not properly displayed 【发布时间】:2020-10-15 03:35:13 【问题描述】:

我对网络开发非常缺乏经验,所以很抱歉上传了这么多可能不必要的代码,但我猜想太多总比太少信息好..

我想显示我从连接的 mysql 数据库获得的 BLOB。 BLOB 未正确显示为图像。相反,我得到它是这样的: enter image description here

在 MySQl 中,BLOB 都是 jpg 格式。我用其他字符串和整数从 MySQL 数据库中检索它们。它们的显示效果很好。我不知道为什么它没有正确显示。希望你能帮助我!

    public class MbBrowse implements Serializable 

    private static final long serialVersionUID = 1L;

    final String SQL_SELECT = "select Vorname, Nachname, Geburtsdatum,Email, Telefon, Krankenkasse, Versicherungskarte, Einlieferung, Entlassung, Station,Diagnose, Therapie, Medikamente from stammdaten";
    final String SQL_SELECT2 = "select Vorname, Nachname, Diagnose, Therapie, Medikamente from stammdaten";

    private boolean connected = false;
    private boolean prevButtonDisabled = true;
    private boolean nextButtonDisabled = true;


    private Util util = new Util();

    private Connection con = null;
    private Statement stm = null;
    private ResultSet rs = null;
    

    private int telefon = 0;
    private String nachname = "";
    private String vorname = "";
    private Date geburtsdatum = new Date(0L);
    private String krankenkasse = "";
    private Blob versicherungskarte;
    private String email = "";

public int getTelefon() 
        return telefon;
    

    public void setTelefon(int n) 
        telefon = n;
    

    public String getNachname() 
        return nachname;
    

    public void setNachname(String s) 
        nachname = s;
    

    public String getVorname() 
        return vorname;
    

    public void setVorname(String s) 
        vorname = s;
    

    public String getKrankenkasse() 
        return krankenkasse;
    

    public void setKrankenkasse(String s) 
        krankenkasse = s;

    

    public String getEmail() 
        return email;
    

    public void setEmail(String s) 
        email = s;

    

    public java.util.Date getGeburtstag() 
        return geburtsdatum;
    

    public void setGeburtstag(java.util.Date dt) 
        if (dt != null)
            geburtsdatum = new Date(dt.getTime());
        else
            geburtsdatum = new Date(0L);
    

    public Blob getVersicherungskarte() 
        return versicherungskarte;
    

    public void setVersicherungskarte(Blob karte) 
        karte = versicherungskarte;
    


    public boolean getPrevButtonDisabled() 
        return prevButtonDisabled;
    

    public boolean getNextButtonDisabled() 
        return nextButtonDisabled;
    

    public boolean getConnected() 
        return connected;
    

    public void setConnected(boolean b) 
        connected = b;
    

    /*--------------------------------------------------------------------------*/

    private void showData() throws SQLException 

        setTelefon(rs.getInt("Telefon"));
        setNachname(rs.getString("Nachname"));
        setVorname(rs.getString("Vorname"));
        setGeburtstag(rs.getDate("Geburtsdatum"));
        setKrankenkasse(rs.getString("Krankenkasse"));
        setVersicherungskarte(rs.getBlob("Versicherungskarte"));
        setEmail(rs.getString("Email"));

    

    /*--------------------------------------------------------------------------*/

    /**
     * Verbindung zur Datenbank herstellen und disconnect button und browse buttons
     * freigeben
     * 
     * @param ae ActionEvent
     */
    public void connect(ActionEvent ae) 

        // out.println( "connect()..." );

        if (util != null)
            con = util.getCon();
        if (con != null) 
            try 
                stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
                rs = stm.executeQuery(SQL_SELECT);
                if (rs.first())
                    showData();
                connected = true;
                prevButtonDisabled = false;
                nextButtonDisabled = false;
             catch (Exception ex) 
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "SQLException", ex.getLocalizedMessage()));
                out.println("Error: " + ex);
                ex.printStackTrace();
            
         else 
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Exception", "Keine Verbindung zur Datenbank (Treiber nicht gefunden?)"));
            out.println("Keine Verbingung zur Datenbank");
        
    









<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<h:head>
    <center>

        <h:head>
            <h:outputStylesheet library="css" name="myCss.css" />
            <title>Patientenverwaltung</title>
            <meta charset="utf-8" />
        </h:head>

    </center>
</h:head>

<h:body style="background-color:#D5D8DC;">


    <h:form>

        <center>


            <h:graphicImage library="img" name="logo.png" />

            <p></p>
            <font face="Verdana" size="5">Stammdaten und Behandlungsdaten</font><br />
            <p></p>

            <h:panelGrid id="panel" columns="4" border="0" cellpadding="10"
                cellspacing="1" styleClass="text">

 
     Vorname
    <h:inputText label="Vorname" 
                    value="#mbBrowse.vorname" maxlength="45" />   

   
     Name 
     <h:inputText label="Name" value="#mbBrowse.nachname"
                    maxlength="45" /> 
                

            
     Geburtstag
    <h:inputText id="id_geburtstag" label="Geburtstag" maxlength="10"
                    value="#mbBrowse.geburtstag">
                    <f:convertDateTime locale="de_DE" pattern="dd.MM.yyyy" type="date"
                        dateStyle="short" timeZone="MET" />
                </h:inputText>
            
                     
    Telefon 
    <h:inputText label="Telefon" maxlength="10"
                    value="#mbBrowse.telefon" />
                
            
     Krankenkasse 
    <h:inputText label="Krankenkasse" maxlength="60"
                    value="#mbBrowse.krankenkasse" /> 
                
                            
     Email 
    <h:inputText label="Email" maxlength="60" value="#mbBrowse.email" /> 
                

                    
    Versicherungskarte 
     <h:graphicImage value="#mbBrowse.versicherungskarte"
                    style="height:100px;width:200px" />
                    
    
</h:panelGrid>

        </center>

        <h:panelGroup>
            <center>



                <p></p>
                <h:commandButton value="&lt;&lt;"
                    disabled="#mbBrowse.prevButtonDisabled" title="Zurück blättern"
                    style="font-size: 130%;" actionListener="#mbBrowse.prev" />
                &#160;&#160;

                <h:commandButton value="&gt;&gt;"
                    disabled="#mbBrowse.nextButtonDisabled" title="Vorwärts blättern"
                    style="font-size: 130%;" actionListener="#mbBrowse.next" />
                &#160;&#160;

                <h:commandButton value="Connect" disabled="#mbBrowse.connected"
                    actionListener="#mbBrowse.connect" style="font-size: 130%;" />
                &#160;&#160;

            </center>
        </h:panelGroup>

    </h:form>
    
</h:body>
</html>

【问题讨论】:

【参考方案1】:

你的Java Server Faces graphicImage 标签

<h:graphicImage value="#mbBrowse.versicherungskarte" style="height:100px;width:200px"/>

当传送到您用户的浏览器时变成

<img src="theContentOfYourBLOB" style="height:100px;width:200px"/>

但是一个格式良好的标签看起来像这样:

<img src="https://some.example.com/whatever/image.jpg" style="height:100px;width:200px" />

换句话说,您不能只是将 BLOB 倒入该标签中并期望它能够工作。您需要该图片的 URL。

您可以将图像存储到服务器的静态对象文件系统(您从中提供 .css、.js 和其他图像文件的文件系统)中一个唯一命名的文件中。然后你将把文件的 URL 作为 标签的值。

或者,您可以使用所谓的Data URL 内联表示您的图像。在这种情况下,您需要将类似这样的 URL 放入 value 参数中。

 data:image/jpeg;base64;R0lGODblahblahblahblah

这里有一些关于如何做到这一点的建议。您基本上必须将 BLOB 中的二进制数据编码为 Base64 并在其前面加上 data:image/jpeg;

专业提示 许多网络应用程序设计人员不会将图像存储在数据库 BLOBS 中,而是将它们存储在文件系统中,并将它们的 URL 存储在数据库字符串中。为什么?当应用程序扩展时,数据库服务器通常会成为性能瓶颈。如果你用图像加载它们,它们将成为更大的瓶颈。

【讨论】:

或者您有一个单独的 jsp 页面,该页面根据 get 参数将 blob 的内容作为图像提供,因此您不必将其内容保存到文件系统。

以上是关于MySQL 中的 BLOB 未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

将Mysql数据库中的BLOB图像显示到html中的动态div中

来自 PUT 的 Azure Blob 存储文档中的“404 资源未找到”

UiImage swift 3中的Mysql blob图像显示

附加 Blob 未正确连接 pdf 页面

显示存储为 MySQL 数据库中 BLOB 数据的所有图像

PHP显示来自MySQL的图像BLOB [重复]