JAVA — не удается получить изображение в базе данных (mysql)

#java #mysql #blob #bufferedimage

#java #mysql #большой двоичный объект #bufferedimage

Вопрос:

Тогда я успешно управлял своей веб-камерой с помощью библиотеки захвата веб-камеры. Вот мой код :

 public void capture() {
    wc.setViewSize(WebcamResolution.QVGA.getSize());
    WebcamPanel wp = new WebcamPanel(wc);
    wp.setMirrored(true);
    JPanel jp = new JPanel();
    tp.setSize(jp.getWidth(), jp.getHeight());
    tp.addTab("", wp);
    tp.getParent().revalidate();
}
  

И так получилось, что я хочу сохранить полученное изображение в своей базе данных (mysql),
хорошо, что я смог его успешно сохранить.
С помощью этих кодов:

 public void save() {
    BufferedImage bi = wc.getImage();
    try {
        ByteArrayOutputStream bimg = new ByteArrayOutputStream();
        ImageIO.write(bi, "JPG", bimg);
        byte[] imgb = bimg.toByteArray();

        try {
            Blob bis = conn.createBlob();
            bis.setBytes(1, imgb);
            String query = "insert into tbl_img (imgid,clientimg) values ('"   but.getText()   "' , '"   bis   "')";
            psmt = conn.prepareStatement(query);
            psmt.executeUpdate();
            JOptionPane.showMessageDialog(null, "Success", "Capture", JOptionPane.NO_OPTION);

        } catch (Exception e) {
            e.printStackTrace();
        }

    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, e);
    }
}
  

Из BufferedImage я преобразовал его в ByteArray, чтобы он соответствовал флагу mysql Blob.
Вместо вставки данных я хочу получить их обратно в виде изображения и поместить в JLabel напрямую через JFrame. Скажем, не занимая места на жестком диске.

У меня есть код для извлечения изображения, но результат выглядит только как белый JFrame.

 public void open() {
    try {
        stmt = conn.createStatement();
        String quer = " select clientimg from tbl_img where imgid='"   open.getText()   "' ";
        ResultSet rs = stmt.executeQuery(quer);
        while (rs.next()) {
            byte[] inbytes = rs.getBytes("clientimg");
            Image img = Toolkit.getDefaultToolkit().createImage(inbytes);
            ImageIcon ico = new ImageIcon(img);
            JFrame jf = new JFrame("Viewer");
            JLabel jl = new JLabel();
            jl.setSize(ico.getIconWidth(), ico.getIconHeight());
            jf.setSize(ico.getIconWidth(), ico.getIconHeight());
            jl.setIcon(ico);
            jf.add(jl);
            jf.setVisible(true);

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}
  

Есть ли другой способ или получение большого двоичного объекта обратно в изображение? если есть, не стесняйтесь изменять код для меня, чтобы сделать его понятнее. Я попробовал, я думаю, все возможные способы из Google.

Комментарии:

1. Я настоятельно рекомендую не делать что-то подобное. Храните такие файлы где-нибудь в папке, а не в базе данных.

2. почему я не могу сохранить изображение в базе данных? . Можете ли вы помочь мне с методом, который вы говорите?

3. На самом деле нет общего правила, для которого это лучший подход. Я работал над системой, в которой требовалось, чтобы все файлы (не только изображения, но также файлы PDF и doc) сохранялись в базе данных. Но помимо этого, вы пытались перенести восстановленные байты в файл для сравнения?

4. я этого не сделал. как я собираюсь это сделать?

5. Чтобы упростить тестирование, вы можете передать массив байтов методу save и использовать эту ссылку для сохранения байтов, сохраненных в базе данных. Затем передайте этот массив байтов методу open и сравните то, что пришло из базы данных, с тем, что у вас есть в памяти. Это только для конкретного теста, я не предлагаю постоянно менять сигнатуры методов.