Maison  >  Article  >  base de données  >  Pourquoi mon code Java convertit-il un objet Blob en image renvoyant une valeur nulle ?

Pourquoi mon code Java convertit-il un objet Blob en image renvoyant une valeur nulle ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 16:54:02326parcourir

Why is my Java code converting a Blob object to an image returning a null value?

Convertir BufferedInputStream en image

La question concerne la conversion d'un objet Blob récupéré d'une base de données en une image à l'aide de la programmation Java. Le Blob est supposé contenir des données d'image, mais la conversion entraîne une valeur nulle.

Réponse

  • Vérifier le Blob téléchargé : Assurez-vous que le uploadedInputStream contient des données d'image valides. Enregistrez-le dans un fichier à l'aide d'ImageIO.write, puis relisez-le pour vérifier son intégrité.
  • Incompatibilité de longueur : Notez que Blob#length renvoie un long tandis que Blob#getBytes attend un int. Vérifiez la valeur de longueur pour éviter une troncature potentielle.
  • Récupération alternative : Le contenu Blob de la base de données H2 peut ne pas être stocké en mémoire. Envisagez plutôt d'utiliser getBinaryStream pour récupérer les données de l'image.

Exemple de code complet

L'extrait de code suivant fournit un exemple de la façon de récupérer et d'afficher une image à partir de une base de données H2 utilisant les considérations susmentionnées :

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 ImageDatabaseExample {

    public static void main(String[] args) {
        try {
            // Load sample image into database
            saveImage();

            // Retrieve and display image
            loadImage();
        } catch (IOException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    protected static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        return DriverManager.getConnection("jdbc:h2:d:\Image", "sa", "");
    }

    protected static void saveImage() throws IOException, ClassNotFoundException, SQLException {
        Connection con = getConnection();
        PreparedStatement stmt = null;
        ByteArrayOutputStream baos = null;
        ByteArrayInputStream bais = null;

        try {
            baos = new ByteArrayOutputStream();
            BufferedImage img = ImageIO.read(new File("/path/to/file"));
            ImageIO.write(img, "png", baos);
            baos.close();

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

            stmt = con.prepareStatement("insert into images (image) values (?)");
            stmt.setBinaryStream(1, bais);
            stmt.executeUpdate();
        } finally {
            if (stmt != null) {
                stmt.close();
            }
            if (con != null) {
                con.close();
            }
        }
    }

    protected static void loadImage() throws IOException, ClassNotFoundException, SQLException {
        Connection con = getConnection();
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            stmt = con.prepareStatement("select image from images");
            rs = stmt.executeQuery();

            while (rs.next()) {
                Blob blob = rs.getBlob(1);
                BufferedImage img = ImageIO.read(blob.getBinaryStream());
                JOptionPane.showMessageDialog(null, new JScrollPane(new JLabel(new ImageIcon(img))));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (con != null) {
                con.close();
            }
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn