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="<<"
disabled="#mbBrowse.prevButtonDisabled" title="Zurück blättern"
style="font-size: 130%;" actionListener="#mbBrowse.prev" />
  
<h:commandButton value=">>"
disabled="#mbBrowse.nextButtonDisabled" title="Vorwärts blättern"
style="font-size: 130%;" actionListener="#mbBrowse.next" />
  
<h:commandButton value="Connect" disabled="#mbBrowse.connected"
actionListener="#mbBrowse.connect" style="font-size: 130%;" />
  
</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 资源未找到”