как получить изображение из базы данных postgresql - PullRequest
0 голосов

Я хочу выбрать изображение, которое сохраняется как большой объект в базе данных postgresql.

Я знаю, что для этого использую lo_export.

, но есть проблема: я хочусохраните это изображение непосредственно на моем компьютере, потому что я не могу получить доступ к файлам, которые сохраняются на сервере, используя lo_export

(я думаю, что для меня будет лучше, если изображение будет перенесено на мой компьютер по запросу select)

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Я точно не знаю, как обходиться с C #, но в руководстве Npgsql есть пример вроде записи столбца bytea в файл:

command = new NpgsqlCommand("select blob from t where id = 1);", conn);
Byte[] result = (Byte[])command.ExecuteScalar();

FileStream fs = new FileStream(args[0] + "database", FileMode.Create, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(new BufferedStream(fs));

bw.Write(result);
bw.Flush();
fs.Close();
bw.Close();

Так что вы просто читаете егобазы данных почти как любой другой столбец и записать его в локальный файл.Пример примерно на половине пути вниз по странице, на которую я ссылался, просто поищите «bytea», и вы найдете его.

ОБНОВЛЕНИЕ : Для больших объектов процесс выглядит аналогичноно меньше SQL-иш.Руководство (как указано выше) включает в себя несколько примеров больших объектов:

NpgsqlTransaction t = Polacz.BeginTransaction();

LargeObjectManager lbm = new LargeObjectManager(Polacz);
LargeObject lo = lbm.Open(takeOID(idtowaru),LargeObjectManager.READWRITE); //take picture oid from metod takeOID

byte[] buf = new byte[lo.Size()];
buf = lo.Read(lo.Size());

MemoryStream ms = new MemoryStream();
ms.Write(buf,0,lo.Size());

// ...

Image zdjecie = Image.FromStream(ms);

Найдите в руководстве «большой объект», и вы его найдете.

0 голосов
/ 11 мая 2011

Если ваши изображения не превышают 1 ГБ (или если вы не используете только части байтов), тогда лучше использовать bytea для их хранения.

Многие инструменты SQL GUI позволяют напрямую загружать (даже просматривать) содержимое столбцов bytea напрямую

0 голосов
/ 09 мая 2011

Не знаком с C #, но если вы используете contrib / dblink и имеете лучший доступ к отдельному серверу postgresql, это может сработать:

  1. выбор большого объекта на плохом сервере db.
  2. скопируйте большой объект на хороший сервер БД, используя dblink.
  3. lo_export на хорошем сервере БД.
...