我試圖創建一個基於駐留在數據庫上的信息的PDF影像。知道我需要檢索一個TIFF圖像,該圖像作爲BLOB存儲在來自Java的mysql數據庫中。我不知道該怎麼做。我找到的例子展示瞭如何檢索它並將其保存爲文件(但在磁盤上),並且我需要駐留在內存中。檢索存儲爲BLOB在MySQL數據庫
表名:IMAGENES_REGISTROS
BLOB字段名稱:IMAGEN
什麼想法?
我試圖創建一個基於駐留在數據庫上的信息的PDF影像。知道我需要檢索一個TIFF圖像,該圖像作爲BLOB存儲在來自Java的mysql數據庫中。我不知道該怎麼做。我找到的例子展示瞭如何檢索它並將其保存爲文件(但在磁盤上),並且我需要駐留在內存中。檢索存儲爲BLOB在MySQL數據庫
表名:IMAGENES_REGISTROS
BLOB字段名稱:IMAGEN
什麼想法?
在您電話ResultSet
:
Blob imageBlob = resultSet.getBlob(yourBlobColumnIndex);
InputStream binaryStream = imageBlob.getBinaryStream(0, imageBlob.length());
或者,您可以撥打:
byte[] imageBytes = imageBlob.getBytes(1, (int) imageBlob.length());
由於BalusC在他的評論中指出的,你最好使用:
InputStream binaryStream = resultSet.getBinaryStream(yourBlobColumnIndex);
而且那麼代碼取決於你將如何閱讀和嵌入圖像。
謝謝,只是一個評論。 imageBlob返回一個Long。而getBytes期望一個Integer。我解析(Integer.ParseInt ..)龍,它的工作原理。我不知道最終是否會帶來問題。 有沒有其他辦法?感謝 – Sheldon 2010-01-27 21:56:51
不要使用'#ResultSet的getBlob()'或'的ResultSet#的getBytes()'。只需使用ResultSet#getBinaryStream()'。 – BalusC 2010-01-28 11:58:42
是它只是一個方便的方法,或有給它更多的東西? – Bozho 2010-01-28 12:00:41
final String dbURL = "jdbc:mysql://localhost:3306/portfolio";
final String dbUser = "root";
final String dbPass = "";
Connection conn = null;
Statement stmt = null;
try {
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
System.out.println("db connected");
stmt = (Statement) conn.createStatement();
ResultSet rs1;
rs1 = stmt.executeQuery("select profileImage from tbl_welcome where id = 1117");
if (rs1.next()) {
byte[] imgData = rs1.getBytes("profileImage");//Here r1.getBytes() extract byte data from resultSet
System.out.println(imgData);
response.setHeader("expires", "0");
response.setContentType("image/jpg");
OutputStream os = response.getOutputStream(); // output with the help of outputStream
os.write(imgData);
os.flush();
os.close();
}
} catch (SQLException ex) {
// String message = "ERROR: " + ex.getMessage();
ex.printStackTrace();
} finally {
if (conn != null) {
// closes the database connection
try {
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
你應該編輯你的答案以包含該信息,而不是添加評論。更多的解釋是很好的 - 只有代碼的答案是不鼓勵的。 – Ajean 2015-10-05 15:41:59
private void loadFileDataBlobFromDataBase()
{
List<Blob> bFile = jdbcTemplate.query(sql, new RowMapper<Blob>() {
@Override
public Blob mapRow(ResultSet rs, int rowNum)
throws SQLException {
return rs.getBlob(1);
}
});
if (bFile != null && bFile.size() > 0) {
bufReader = new BufferedReader(new InputStreamReader(bFile.get(
0).getBinaryStream()));
}
if (null != bufReader) {
dataVO record = null;
String lineStr = bufReader.readLine();
record = (dataVO) lineMapper.mapLine(lineStr, 1);
}
}
}
您使用普通的JDBC? – Bozho 2010-01-27 21:25:34
是Bozho,普通的JDBC與MySQL lib中的Java。 – Sheldon 2010-01-27 21:28:42
看到我的更新答案 - 原來還存在另一種方式做到這一點:) – Bozho 2010-01-27 23:07:20