java - 如何使用 Java 将 JPEG 图像插入 PostgreSQL bytea 字段,然后使用 PHP 显示在网站上?

标签 java php postgresql bytea jdbc-postgres

我制作了一个读取图像文件 (jpg/jpeg) 并将它们插入数据库表 covers.cover 的小 Java 程序,该表的类型为 bytea

我相当确定传递给 Java addCover(int riddim_id, byte[] cover, byte[] thumbnail) 的 byte[] cover 参数方法包含有效的 jpeg 数据(我通过将其写入 .jpeg 文件进行了测试,显示正常)。

数据库函数 add_cover(riddim INT, cover BYTEA, thumbnail BYTEA) 似乎被正确调用;调用后表中有数据,我没有收到任何 SQL 错误。

不过,数据看起来有点像

\377\330\377\340\000\020JFIF\000\001\001\001\001,\001,\000\000\377\333\000C\000\013\010\010\010\011\010\014\011\011\014\021\013\012\013\021\024\017\014\014\017\024\027\022\022\022\022\022\027\030\023\024\024\024\024\023\030\026\032\033\034\033\032\026""$$"".....0000000000\377\333\000C\001\014\014\014\020\020\020\027\021\021\027\030\024\023\024\030\036\033\034\034\033\036$\036\036\037\036\036$)#    #)&($$$(&++))++000000000000000\377\300\000\021\010\005\200\005\230\003\001\021\000\002\021\001\003\021\001\377\304\000\033\000\000\003\000\003\001\001\000\000\000\000\000\000\000\000\000\000\000\001\002\003\004\006\005\007\377\304\000U\020\000\001\002\004\003\005\004\010\003\006\005\003\003\001\001\021\001\002\021\000!1A\003\022Q\004"2Ba\005\023bq\006CRr\201\221\241\3603\261\301\024#c\202\321

等等,对我来说它看起来不像是有效数据。我期待一些更统一的东西(较少的特殊字符,如 "$),比如 \x01E25A43

当我转到 http://foo.bar/image.php(如下所示的 PHP 脚本)时,Firefox 告诉我图像无法显示,因为它包含错误数据。

我假设我没有正确使用 BYTEA 字段,但我无法弄清楚我做错了什么。有什么建议吗?

数据库表如下所示:

CREATE TABLE covers (
    cover_id              SERIAL      PRIMARY KEY,
    riddim_id             SERIAL      UNIQUE REFERENCES riddims (riddim_id),
    coverhash             VARCHAR(32) NOT NULL UNIQUE,
    cover                 BYTEA       NOT NULL,
    thumbnail             BYTEA       NOT NULL
);

我用 java 调用的数据库函数如下所示:

CREATE OR REPLACE FUNCTION add_cover(_riddim_id INT, _cover BYTEA, _thumbnail BYTEA) RETURNS INTEGER AS $$
DECLARE
    _cover_id INT;
BEGIN
    SELECT cover_id INTO _cover_id FROM covers WHERE riddim_id = _riddim_id;

    IF (_cover_id IS NULL) THEN
        INSERT INTO covers (riddim_id, coverhash, cover, thumbnail) VALUES (
            _riddim_id,
            md5(_cover),
            _cover,
            _thumbnail
        ) RETURNING cover_id INTO _cover_id;
    END IF;

    RETURN _cover_id;
END;
$$ LANGUAGE plpgsql;

使用 JDBC 连接器调用上述数据库函数的 Java 方法如下所示:

private int addCover(int riddim_id, byte[] cover, byte[] thumbnail) 
        throws SQLException {    
    int cover_id;

    try (CallableStatement cs = conn.prepareCall("{ ? = call add_cover(?, ?, ?) }")) {
        cs.registerOutParameter(1, Types.INTEGER);
        cs.setInt(2, riddim_id);
        cs.setBytes(3, cover);
        cs.setBytes(4, thumbnail);
        cs.execute();
        cover_id = cs.getInt(1);
    }

    return (cover_id != 0) ? cover_id : -1;
}

将数据作为图像/jpeg 发送到浏览器的 PHP 脚本(我在 Google 某处找到的):

<?php
  // Connect to the database
  $dbconn = pg_connect("<censored>");

  // Get the bytea data
  $res = pg_query("SELECT cover FROM covers WHERE cover_id = 11");
  $raw = pg_fetch_result($res, 'cover');

  // Convert to binary and send to the browser
  header('Content-type: image/jpeg');
  echo pg_unescape_bytea($raw);
?>

我正在运行 PostgreSQL 版本 9.4.4,使用 postgresql-9.4-1202.jdbc41.jar

最佳答案

查询失败但没有给出错误消息(更准确地说,查询总是返回一个空结果集)因为我使用的是 pg_connect("host=foo.bar ...") 但是 pg_hba.conf 显然没有配置为允许从本地主机发送的外部连接。将 host=foo.bar 更改为 host=localhost 解决了问题。

我不太确定为什么 $dbconn 返回 true,我发现在检查 /var/log/postgresql 时连接出了问题/postgresql-9.4-main.log 告诉我,我尝试连接的用户在 pg_hba.conf 中没有针对指定的 host 的有效设置.

关于java - 如何使用 Java 将 JPEG 图像插入 PostgreSQL bytea 字段,然后使用 PHP 显示在网站上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513422/

相关文章:

php - 如何使用 composer 安装 PHPWord 库

java - 如何读取Maven应用程序的webapp文件夹中的目录

java - JDBC嵌入式Derby : No suitable driver found

php - 我尝试使用 sort() 对数组进行排序,但它失败了

sql - 从 Slick 3.x 中的分组依据中按列选取最大项目

ruby-on-rails - rails/Postgres : column must appear in the GROUP BY clause

postgresql - 由于空白字符串被视为不存在的数据,无法从 pg_dump 恢复数据

java - 以编程方式向 yarn 提交 spark 应用程序

java - org.flywaydb.core.api.FlywayException : Unable to instantiate JDBC driver when my java class is triggered from ant taskdef

PHP, mongo.so 写入失败