sql >> データベース >  >> RDS >> Mysql

BufferedInputStreamを画像に変換します

    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) {
                }
            }
    
        }
    
    }
    



    1. PostgreSQLで月ごとの成長を計算する方法

    2. エラー:Postgresを使用したシーケンスcitys_id_seqの権限が拒否されました

    3. RUNAS / NETONLY機能を(C#/。NET / WinForms)プログラムに組み込む方法は?

    4. SQL Server IFとIIF():違いは何ですか?