Nodejs, store bin files as BYTEA into pgsql (corrupted files)

Viewed 5245

For some reason I need to store some files (mostly images or pdfs) into my database (PG 9.2.20). Those files are uploaded by users and when I download them back, they are corrupted.

  • I'm working with nodejs.
  • The column type I store the file is BYTEA.

This is how I store them :

const { files, fields } = await asyncBusboy(ctx.req);
const fileName = files[0].filename;
const mimeType = files[0].mimeType;
const bufferedFile = fs.readFileSync(files[0].path, { encoding: 'hex' });
const fileData = `\\x${bufferedFile}`;

//Just a basic insert into with knex.raw
const fileId = await storageModel.create(fields.name, fields.description, fileName, mimeType, fileData, ctx.user);

And this is how I retrieve my file :

const file = await storageModel.find(ctx.params.fileId, ctx.user);
ctx.body = Buffer.from(file.file_bin, 'hex');
ctx.set('Content-disposition', `attachment; filename=${file.file_name}`);

The file is corrupted, and of course, if I look closely, the uploaded file and the one I downloaded are different. See hex screenshot, there is some additional data at the start of the downloaded one : http://imgur.com/a/kTRAB

After some more testing I can tell the problem lies into the koa part, when I put the buffer into the ctx.body. It got corrupted (???)

EDIT : I was working with Swagger UI : https://github.com/swagger-api/swagger-ui/issues/1605

1 Answers
Related