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

时间:2019-04-03 14:53:09

标签: node.js postgresql typescript nestjs typeorm

我正在尝试将一些图像保存在postgres db上,但是仅保存了10个字节的数据。

流程是这样的:

我在服务器上收到一个base64编码的字符串,然后将其加载到Buffer,将其设置为我的实体并保存。 但是然后尝试从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);

在服务器上,在保存之前,我正在将文件写在光盘上,并且可以对其进行可视化显示。

3 个答案:

答案 0 :(得分:0)

基于该评论https://github.com/typeorm/typeorm/issues/2878#issuecomment-432725569和从那里开始{by3} bytea十六进制格式的想法,我执行了以下操作:

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

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

现在,数据可以毫无问题地保存下来,我可以像预期的那样检索它们。

它看起来并不那么优雅,但目前已经解决了问题。

答案 1 :(得分:0)

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

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

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

保存时

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

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

答案 2 :(得分:0)

也许自从最后一个答案后,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字符串,可以将其作为图像插入网页