使用 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 个字节的主要内容,如果未能解决你的问题,请参考以下文章
节点服务器无法通过 Docker 连接到 Postgres,使用 TypeORM
我如何将 Postgres DateRange 类型与 TypeOrm 一起使用
使用 TypeORM 在 Postgres bytea 上保存缓冲区仅存储 10 个字节