Как вставить изображение JPEG в поле байта PostgreSQL с помощью Java, а затем отобразить на веб-сайте с помощью PHP?

Я сделал небольшую Java-программу, которая читает файлы изображений (jpg / jpeg) и вставляет их в таблицу базы данных. covers.cover, который имеет тип bytea,

Я уверен, что byte[] cover параметр, который передается в Java addCover(int riddim_id, byte[] cover, byte[] thumbnail) Метод содержит допустимые данные 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;

Java-метод это вызывает функцию базы данных выше с использованием JDBC-коннектора выглядит так:

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

PHP скрипт (что я нашел где-то в Google), который отправляет данные в виде изображения / JPEG в браузер:

<?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.

2

Решение

Запрос не прошел без сообщения об ошибке (точнее, запрос всегда возвращал пустой набор результатов), потому что я использовал pg_connect("host=foo.bar ...") но pg_hba.conf не был настроен для разрешения внешних подключений, отправленных с localhost, по-видимому. изменения host=foo.bar в host=localhost решил проблему.

Я не совсем уверен, почему $dbconn возвращенный true, Я выяснил, что что-то пошло не так с соединением при проверке /var/log/postgresql/postgresql-9.4-main.log который сказал мне, что пользователь, с которым я пытался соединиться, не имел корректных настроек для указанного host в pg_hba.conf,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]