【问题标题】:Using Wicket to display an image stored as BLOB in MYSQL db使用 Wicket 在 MYSQL 数据库中显示存储为 BLOB 的图像
【发布时间】:2014-01-05 08:34:39
【问题描述】:

我的 mysql 数据库中目前有一个包含图像的 blob。 我想要的是向用户显示此图像。

我不能将它放在目录结构中,因为 blob 可能是从图像到 html 的任何内容,因此涉及到它是 html 还是图像等的逻辑。

我正在考虑检查 BLOB 以查看它是否是图像,它可以将其输出到临时目录然后将其作为资源加载,但后来我注意到 wicket 有一个 BlobImageResource 类但是我不确定这是怎么回事已实施,在谷歌搜索后无法找到任何示例。

任何建议如何最好地做到这一点?

我正在使用 wicket 6.xx 并且可以访问 spring 和 hibernate,并且不反对使用第三方库

【问题讨论】:

  • 您控制上传过程吗?您可以将内容类型与 blob 一起保存到数据库中。
  • 在最坏的情况下,您可以使用 *nix 的 file 命令并使用大量 if 解析结果。 :)
  • 见这里stackoverflow.com/questions/9687688/…。只需检查 blob 的魔术字节以确定它是否是图像。见en.wikipedia.org/wiki/List_of_file_signatures
  • 您应该始终将数据类型(mime 类型)与您的 blob 一起存储,以确保正确加载数据。
  • 您的问题到底是什么?显示动态图像或检测 blob 内容类型?

标签: mysql image hibernate wicket blob


【解决方案1】:
private byte[] blob = some data...;

检查 blob 是图像:

Boolean isImage = ImageIO.read(new ByteArrayInputStream(blob)) != null;
if( isImage ){
    // blob is an image...
}

创建一个 IResource 对象并在 html 中显示:

IResource imageResource = new DynamicImageResource() {
                @Override
                protected byte[] getImageData(IResource.Attributes attributes) {
                    return blob;
                }
            };
Image image = new Image("wicketId", imageResource);
this.add(image);

在html文件中使用:

<wicket:panel>
    <img wicket:id="wicketId"/>
</wicket:panel>

【讨论】:

  • 这适用于 PNG 图像。要使用其他图像格式,我们必须像这样设置格式: imageResource.setFormat("svg+xml"); // 对于图片/svg+xml
【解决方案2】:

从 MySql DB 到 HTML 页面的 blob 图像的 Wicket 代码

公共类 BlobToImage 扩展 WebPage{

private static Blob blob;
public BlobToImage() {

    BlobImageResource blobImgSrc = new BlobImageResource() {

        @Override
        protected Blob getBlob(Attributes attributes) {             
            return blob;
        }
    };
    try {
        getBlob();
    } catch (SQLException e) {
        e.printStackTrace();
    }   

    Image img = new Image("image", blobImgSrc);
    add(img);
}

public static void getBlob() throws SQLException{
    Properties ConProps = new Properties();
    ConProps.put("user","root");
    ConProps.put("password", "root");

    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/google_map",ConProps);
    System.out.println(conn);

    java.sql.Statement stmt = conn.createStatement();
    stmt.execute("SELECT id,image FROM images where id=1");
    ResultSet rs = stmt.getResultSet();
    while(rs.next()){
        try{
            blob = rs.getBlob("image");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

} 以下 HTML 代码有助于在网页上显示图片

    Image <img wicket:id="image"  alt="image">      

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多