node.js - Spara Buffer på Postgres bytea med TypeORM lagrar bara 10 byte
Jag försöker spara några bilder i en Postgres-databas, men bara 10 byte data sparas.
Flödet är något i stil med detta:
Jag får en base64-kodad sträng på min server, sedan laddar jag den till en Buffer, sätter den på min enhet och sparar den. Men sedan försöker jag återställa den informationen från databasen och jag får bara 10 byte data, verifierat med octet_length() i en fråga.
Min enhets attributdefinition:
@Column({ "name": "entima_imagem", "type": "bytea", "nullable": false })
entima_imagem: Buffer;
Koden där jag tar emot datan och sparar den:
entity.entima_imagem = Buffer.from(base64String, "base64");
const repository = this.getRepositoryTarget(Entity);
const saved = await repository.save<any>(entity);
På servern, innan jag sparar, skriver jag filen på skivan och jag kan se den utan problem.
Svar #1
Baserat på den kommentaren https://github.com/typeorm/typeorm/issues/2878#issuecomment-432725569 och idén med bytea hex-format därifrån https://www.postgresql.org/docs/9.0/datatype-binary.html gjorde jag följande:
Avkodade bufferten till en hex-sträng, escapeade den med \x och laddade sedan tillbaka den till en buffer igen.
entity.entima_imagem = Buffer.from("\\x" + Buffer.from(base64String, "base64").toString("hex"));
Nu sparas datan utan problem och jag kan hämta dem precis som det är tänkt.
Det såg inte så elegant ut, men löste problemet för tillfället.
Svar #2
Jag hade liknande problem. Det verkar som att TypeORM har problem med 0x00-byte. Det skär allt från första 0-byte.
En liknande lösning fungerade för mig:
@Column({ type: "bytea", nullable: false })
public file: Buffer;
medan du sparar:
log.file = ("\\x" + file.toString( "hex" )) as any;
Att skapa en buffer från "\\x"+content-strängen som @JDuwe föreslog fungerade inte för mig. Jag var tvungen att tillhandahålla en sträng till typeorm, inte en Buffer.
