使用 TypeORM 在 Postgres bytea 上保存缓冲区仅存储 10 个字节

Posted

技术标签:

【中文标题】使用 TypeORM 在 Postgres bytea 上保存缓冲区仅存储 10 个字节【英文标题】:Saving Buffer on Postgres bytea with TypeORM only store 10 bytes 【发布时间】:2019-08-25 03:48:42 【问题描述】:

我正在尝试在 postgres 数据库中保存一些图像,但只保存了 10 个字节的数据。

流程是这样的:

我在我的服务器上收到一个 base64 编码的字符串,然后我将它加载到一个缓冲区,将它设置到我的实体并保存它。 但随后尝试从 db 中恢复该信息,我只得到 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);

在服务器上,在保存之前,我正在将文件写入磁盘,我可以毫无问题地对其进行可视化。

【问题讨论】:

【参考方案1】:

根据https://github.com/typeorm/typeorm/issues/2878#issuecomment-432725569 的评论以及 https://www.postgresql.org/docs/9.0/datatype-binary.html 那里的 bytea 十六进制格式的想法,我做了以下事情:

将 Buffer 解码为十六进制字符串,使用 \x 对其进行转义,然后再次将其加载到 Buffer 中。

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

现在数据保存没有问题,我可以按原样检索它们。

看起来没那么优雅,但暂时解决了问题。

【讨论】:

【参考方案2】:

我有类似的问题。看起来 typeorm 的 0x00 字节有问题。它从第一个 0 字节开始对所有内容进行切片。

类似的解决方法对我有用:

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

保存时:

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

按照@JDuwe 的建议从 "\\x"+content 字符串创建缓冲区对我不起作用。 我必须为 typeorm 提供一个字符串,而不是 Buffer。

【讨论】:

【参考方案3】:

也许自从最后一个答案 postgres 或 typeorm 解决了它,但在两者的最新版本上,我设法在没有任何“hack”的情况下完成这项工作 这是实体列的代码

@Column(
    name: 'imageData',
    type: 'bytea',
    nullable: false,
)
imageData: Buffer;

我做的唯一一件事就是将 base64 字符串转换为 Buffer,但这与 typeorm 无关

 constructor(imageDataBase64: string) 
    if (imageDataBase64) 
        this.imageData = Buffer.from(imageDataBase64, 'base64');
    

即使我使用 typeorm 的同步功能

在检索期间:

imageData.toString('base64')

我取回了可以作为图片插入网页的原始 base64 字符串

【讨论】:

以上是关于使用 TypeORM 在 Postgres bytea 上保存缓冲区仅存储 10 个字节的主要内容,如果未能解决你的问题,请参考以下文章

TypeORM 中的 Postgres 枚举

节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM

我如何将 Postgres DateRange 类型与 TypeOrm 一起使用

使用 TypeORM 在 Postgres bytea 上保存缓冲区仅存储 10 个字节

如何在 typeorm、postgres 中组合 3 列唯一的?

存储 GeoJson 点并在给定距离/半径内查找点 | NODEJS、Postgres、NestJs、TypeOrm