Heim  >  Artikel  >  Datenbank  >  Warum konvertiert mein Java-Code ein Blob-Objekt in ein Bild und gibt einen Nullwert zurück?

Warum konvertiert mein Java-Code ein Blob-Objekt in ein Bild und gibt einen Nullwert zurück?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 16:54:02326Durchsuche

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

BufferedInputStream in Bild konvertieren

Die Frage bezieht sich auf die Konvertierung eines aus einer Datenbank abgerufenen Blob-Objekts in ein Bild mithilfe der Java-Programmierung. Es wird davon ausgegangen, dass der Blob Bilddaten enthält, aber die Konvertierung führt zu einem Nullwert.

Antwort

  • Hochgeladenen Blob überprüfen: Stellen Sie sicher, dass der uploadedInputStream gültige Bilddaten enthält. Speichern Sie es mit ImageIO.write in einer Datei und lesen Sie es dann zurück, um seine Integrität zu überprüfen.
  • Längenkonflikt: Beachten Sie, dass Blob#length einen langen Wert zurückgibt, während Blob#getBytes einen int erwartet. Überprüfen Sie den Längenwert, um eine mögliche Kürzung zu vermeiden.
  • Alternativer Abruf: Der Blob-Inhalt der H2-Datenbank wird möglicherweise nicht im Speicher gespeichert. Erwägen Sie stattdessen die Verwendung von getBinaryStream, um die Bilddaten abzurufen.

Vollständiges Codebeispiel

Der folgende Codeausschnitt bietet ein Beispiel dafür, wie ein Bild abgerufen und angezeigt wird eine H2-Datenbank unter Verwendung der oben genannten Überlegungen:

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();
            }
        }
    }
}

Das obige ist der detaillierte Inhalt vonWarum konvertiert mein Java-Code ein Blob-Objekt in ein Bild und gibt einen Nullwert zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn