开发者社区 问答 正文

将BufferedInputStream转换为图像?mysql

我无法将我的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);

展开
收起
保持可爱mmm 2020-05-17 18:20:05 679 分享 版权
1 条回答
写回答
取消 提交回答
  • 首先,先确认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) {
            }
        }
    
    }
    

    }来源:stack overflow

    2020-05-17 18:26:47
    赞同 展开评论