将BufferedInputStream转换为图像

我无法将我的Blob转换为缓冲图像,因此可以使用它。我从使用inputstream上传的数据库中得到了一个blob(jpg图像)。在我的数据库中,它存储为BufferedInputStream,我注意到了。我得到的Blob很好,它有一堆怪异的符号,并说它是jpg,所以图像必须很好。谁能发现我在做什么错?也许我将其转换为错误?在image

= ImageIO.read(new ByteArrayInputStream(data)); 图片返回null。

@GET

@Path("{id}")

@Produces("image/*")

public Response post(@PathParam("id") String id) throws IOException {

Connection con = connection();

Blob blob = getPhoto(con);

BufferedImage image = null;

byte[] data = null;

int blobLength = 0;

try {

blobLength = (int) blob.length();

data = blob.getBytes(1, blobLength);

image = ImageIO.read(new ByteArrayInputStream(data));

// ImageIO.write(image, "JPEG", new File("C:/Users/Nicolas/Desktop/image.jpg"));

} catch (SQLException e2) {

e2.printStackTrace();

}

return Response.ok(image).build();

}

我如何写入数据库

public void postPhoto(Connection con, InputStream uploadedInputStream){

String mySQL = "INSERT INTO photos (photo) values (?)";

PreparedStatement pStmt = con.prepareStatement(mySQL);

pStmt.setBlob(1, uploadedInputStream);

pStmt.execute();

}

我如何将文件发送到我的servlet

var fileInput = document.getElementById('file');

var file = fileInput.files[0];

var formData = new FormData();

formData.append("file", file);

var parameters="first="+firstName+"&last="+lastName+"&file="+file;

xmlhttp.open("post","http://localhost:8080/restService/api/submitinfo",true);

xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlhttp.send(formData);

回答:

首先,先确认uploadedInputStream是有效图像,然后再使用将其写出来ImageIO.write。您始终可以使用ImageIO.read读回的图像并将其写回到ByteArrayInputStream;)

我使用H2数据库进行了快速测试。

我注意到了几件事。 Blob#length返回long,而Blob#getBytes期望则返回int,这可能意味着您正在截断字节流。

另外,从H2的文档来看,似乎Blob内容没有保存在内存中,因此我改用了getBinaryStream

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.IOException;

import java.sql.Blob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

public class TestImageDatbase {

private Connection con;

public static void main(String[] args) {

new TestImageDatbase();

}

public TestImageDatbase() {

try {

clearDatabase();

saveImage();

loadImage();

} catch (ClassNotFoundException | SQLException | IOException exp) {

exp.printStackTrace();

}

}

protected Connection getConnection() throws ClassNotFoundException, SQLException {

Class.forName("org.h2.Driver");

return DriverManager.getConnection("jdbc:h2:d:\\Image", "sa", "");

}

protected void clearDatabase() throws IOException, ClassNotFoundException, SQLException {

Connection con = null;

PreparedStatement stmt = null;

try {

con = getConnection();

System.out.println("Cleaning database");

stmt = con.prepareStatement("delete from images");

int updated = stmt.executeUpdate();

System.out.println("Updated " + updated + " rows");

} finally {

try {

stmt.close();

} catch (Exception e) {

}

try {

con.close();

} catch (Exception e) {

}

}

}

protected void saveImage() throws IOException, ClassNotFoundException, SQLException {

Connection con = null;

PreparedStatement stmt = null;

ByteArrayOutputStream baos = null;

ByteArrayInputStream bais = null;

try {

baos = new ByteArrayOutputStream();

File source = new File("/path/to/file");

System.out.println("Source size = " + source.length());

BufferedImage img = ImageIO.read(source);

ImageIO.write(img, "png", baos);

baos.close();

bais = new ByteArrayInputStream(baos.toByteArray());

con = getConnection();

stmt = con.prepareStatement("insert into images (image) values (?)");

stmt.setBinaryStream(1, bais);

int updated = stmt.executeUpdate();

System.out.println("Updated " + updated + " rows");

} finally {

try {

bais.close();

} catch (Exception e) {

}

try {

baos.close();

} catch (Exception e) {

}

try {

stmt.close();

} catch (Exception e) {

}

try {

con.close();

} catch (Exception e) {

}

}

}

protected void loadImage() throws IOException, ClassNotFoundException, SQLException {

Connection con = null;

PreparedStatement stmt = null;

ResultSet rs = null;

try {

con = getConnection();

stmt = con.prepareStatement("select image from images");

rs = stmt.executeQuery();

while (rs.next()) {

System.out.println("Getting blob");

Blob blob = rs.getBlob(1);

System.out.println("Reading image");

BufferedImage img = ImageIO.read(blob.getBinaryStream());

System.out.println("img = " + img);

JOptionPane.showMessageDialog(null, new JScrollPane(new JLabel(new ImageIcon(img))));

}

} finally {

try {

rs.close();

} catch (Exception e) {

}

try {

stmt.close();

} catch (Exception e) {

}

try {

con.close();

} catch (Exception e) {

}

}

}

}

以上是 将BufferedInputStream转换为图像 的全部内容, 来源链接: utcz.com/qa/429501.html

回到顶部