首页 >数据库 >mysql教程 >为什么我的 Java 代码将 Blob 对象转换为图像时返回空值?

为什么我的 Java 代码将 Blob 对象转换为图像时返回空值?

Patricia Arquette
Patricia Arquette原创
2024-11-09 16:54:02387浏览

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

Convert BufferedInputStream into Image

问题涉及使用 Java 编程将从数据库检索的 Blob 对象转换为图像。假设 Blob 包含图像数据,但转换会产生空值。

答案

  • 验证上传的 Blob: 确保uploadedInputStream包含有效的图像数据。使用 ImageIO.write 将其保存到文件,然后读回以验证其完整性。
  • 长度不匹配: 请注意,Blob#length 返回 long,而 Blob#getBytes 需要 int。验证长度值以避免潜在的截断。
  • 替代检索: H2 数据库的 Blob 内容可能不会存储在内存中。考虑使用 getBinaryStream 来检索图像数据。

完整代码示例

以下代码片段提供了如何从以下位置检索和显示图像的示例:使用上述考虑因素的 H2 数据库:

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

以上是为什么我的 Java 代码将 Blob 对象转换为图像时返回空值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn