在大量学习之后Blobs,我设法编写了以下Java代码以将图像写入访问DB(使用UCanaccess)并将其写回磁盘。
当我将图像写回磁盘时,图像的格式不正确,或者某些东西搞砸了,您无法打开该图像。
我知道将图像存储在DB上不是一个好习惯,但这仅是我的学习。
public static void Update_to_DB() throws SQLException, IOException {
String URL = "jdbc:ucanaccess://C:\Users\bharat.nanwani\Desktop\Images.accdb";
Connection conn = DriverManager.getConnection(URL);
//Statement stmt = conn.createStatement();
PreparedStatement p;
File ImgPath = new File("C:\Users\bharat.nanwani\Desktop\Desert.jpg");
BufferedImage bufferedimage = ImageIO.read(ImgPath);
WritableRaster raster = bufferedimage.getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
byte[] bytearray = date.getdata();
String query = "INSERT INTO Images(data) VALUES(?);";
p = conn.prepareStatement(query);
p.setBinaryStream(1, new ByteArrayInputStream(bytearray),bytearray.length);
p.execute();
}
public static void update_to_DISK() throws SQLException, IOException {
String URL = "jdbc:ucanaccess://C:\Users\bharat.nanwani\Desktop\Images.accdb";
Connection conn = DriverManager.getConnection(URL);
PreparedStatement p;
ResultSet rs;
String query = "SELECT Data FROM Images";
p=conn.prepareStatement(query);
rs = p.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob("Data");
byte[] bytearray = blob.getBytes(1L, (int)blob.length());
FileOutputStream fos = new FileOutputStream("C:\Users\bharat.nanwani\Desktop\New Folder\test.jpg");
fos.write(bytearray);
fos.close();
System.out.println(bytearray);
}
}
首先,您应该将其分为两个部分:
- 将二进制数据存储在数据库中并检索
- 加载图像文件并再次保存
无需使用数据库来测试第二部分 - 您应该通过加载图像并直接保存到文件,跳过数据库来诊断问题。
否,我相信问题是您正在复制Writableraster的数据库,然后将其保存到.jpg
文件中。当时不是JPEG - 它是WritableRaster
使用的内部格式。
如果您想要一个JPEG文件,则根本不需要使用ImageIO,因为您已经从JPEG文件开始了。如果要以同一图像启动和结束,只需复制文件(在您的情况下,将文件保存到数据库)。那只是将文件视为字节。
如果您需要做一些以不同格式或以不同尺寸的保存等等的事情,则应要求Imageio库将image 作为 a jpeg再次保存,请重新编码它...然后将结果存储为文件或数据库等。
使用FileInputStream
而不是WritableRaster
,然后使用PreparedStatement
的setBinaryStream()
方法将图像文件存储在数据库中..
它将将文件存储在字节中。
同样,从数据库中获取文件时,请使用getBytes()
的ResultSet
方法并使用FileOutputStream
public static void Update_to_DB() throws SQLException, IOException {
String URL = "jdbc:ucanaccess://C:\Users\bharat.nanwani\Desktop\Images.accdb";
Connection conn = DriverManager.getConnection(URL);
//Statement stmt = conn.createStatement();
PreparedStatement p;
File ImgPath = new File("C:\Users\bharat.nanwani\Desktop\Desert.jpg");
FileInputStream fin = new FileInputStream(ImgPath);
String query = "INSERT INTO Images(Data) VALUES(?);";
p = conn.prepareStatement(query);
p.setBinaryStream(1, fin);
p.execute();
}
public static void update_to_DISK() throws SQLException, IOException {
String URL = "jdbc:ucanaccess://C:\Users\bharat.nanwani\Desktop\Images.accdb";
Connection conn = DriverManager.getConnection(URL);
PreparedStatement p;
ResultSet rs;
String query = "SELECT Data FROM Images";
p = conn.prepareStatement(query);
rs = p.executeQuery();
if (rs.next()) {
byte[] bytearray = rs.getBytes("Data");
FileOutputStream fos = new FileOutputStream("C:\Users\bharat.nanwani\Desktop\New Folder\test.jpg");
fos.write(bytearray);
fos.close();
System.out.println(bytearray);
}
}
它将解决您的问题。
以下是我要写入db的方法 -
public static void main(String[] Args) throws SQLException, IOException {
String URL = "jdbc:ucanaccess://C:\Users\bharat.nanwani\Desktop\Images.accdb";
Connection conn = DriverManager.getConnection(URL);
PreparedStatement p;
File ImgPath = new File("C:\Users\bharat.nanwani\Desktop\Desert.jpg");
FileInputStream fileinput = new FileInputStream(ImgPath);
byte[] bytearray = new byte[(int)ImgPath.length()];
String query = "INSERT INTO Images(data) VALUES(?);";
p = conn.prepareStatement(query);
//p.setBinaryStream(1, new ByteArrayInputStream(bytearray),bytearray.length);
p.setBytes(1, bytearray);
p.execute();
}