来自 MySQL 的 BLOB 未正确显示



我在Web开发方面非常缺乏经验,所以我很抱歉上传了这么多可能不必要的代码,但我猜得太多总比信息太少好。

我想显示我从连接的MySQL数据库获得的BLOB。 BLOB 未正确显示为图像。相反,我得到的是这样的: 在此处输入图像描述

在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>

您的 Java 服务器面孔图形图像标记

<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作为<h:graphicImage>标记。

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

data:image/jpeg;base64;R0lGODblahblahblahblah

以下是有关如何执行此操作的一些建议。基本上,您必须将 BLOB 中的二进制数据编码为 Base64,并在其前面附加data:image/jpeg;

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

最新更新