Сохранение буфера в Postgres Bytea с сохранением TypeORM только 10 байтов - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь сохранить некоторые изображения в базе данных postgres, но сохраняются только 10 байтов данных.

Поток выглядит примерно так:

Я получаю кодировку base64строка на моем сервере, затем я загружаю его в буфер, устанавливаю его в мою сущность и сохраняю.Но затем попытайтесь восстановить эту информацию из базы данных, и я получаю только 10 байтов данных, проверенных с помощью octet_length () в запросе.

Определение моего атрибута сущности:

@Column({ "name": "entima_imagem", "type": "bytea", "nullable": false })
entima_imagem: Buffer;

Код, в который я получаю данные и сохраняю их:

entity.entima_imagem = Buffer.from(base64String, "base64");
const repository = this.getRepositoryTarget(Entity);
const saved = await repository.save<any>(entity);

На сервере перед сохранением я записываю файл на диск и могу без проблем визуализировать его.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

У меня была похожая проблема.Похоже, что у typeorm проблемы с байтом 0x00.Он нарезает все, начиная с первого 0 байтов.

Подобный обходной путь работал для меня:

@Column({ type: "bytea", nullable: false })
public file: Buffer;

при сохранении:

log.file = ("\\x" + file.toString( "hex" )) as any;

Создание буфера из "\\x "+ строка содержимого, как предложил @JDuwe, у меня не работает.Я должен был предоставить строку для typeorm, а не Buffer.

0 голосов
/ 03 апреля 2019

Основываясь на этом комментарии https://github.com/typeorm/typeorm/issues/2878#issuecomment-432725569 и идее шестнадцатеричного формата bytea оттуда https://www.postgresql.org/docs/9.0/datatype-binary.html Я сделал следующее:

Декодировал буфер в шестнадцатеричную строку, экранировал его с помощью \ x, а затем снова загрузил его в буфер.

entity.entima_imagem = Buffer.from("\\x" + Buffer.from(base64String, "base64").toString("hex"));

Теперь данные сохраняются без проблем, и я могу получить их так, как и должно быть.

Это не выглядело так элегантно, но решило проблему на данный момент.

...