Nodejs,将bin文件作为BYTEA存储到pgsql(损坏的文件)

时间:2017-07-15 12:26:25

标签: node.js postgresql buffer koa koa2

出于某种原因,我需要将一些文件(主要是图像或pdf)存储到我的数据库中(PG 9.2.20)。 这些文件由用户上传,当我下载它们时,它们已损坏。

  • 我正在使用nodejs。
  • 我存储文件的列类型是BYTEA。

这就是我存储它们的方式:

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);

这就是我检索文件的方式:

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}`);

文件已损坏,当然,如果仔细观察,上传的文件和我下载的文件会有所不同。 请参阅十六进制屏幕截图,在下载的一个开始时还有一些其他数据:http://imgur.com/a/kTRAB

经过一些测试后,我可以将问题告诉koa部分,当我将缓冲区放入ctx.body时。它被破坏了(???)

编辑:我正在使用Swagger UI:https://github.com/swagger-api/swagger-ui/issues/1605

1 个答案:

答案 0 :(得分:1)

您不应将bytea用作常规文本字符串。您应该直接传递Buffer类型,并让驱动程序为您正确地转义它。

不确定您使用的驱动程序,例如......