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

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

  • 我在使用nodejs。
  • 我存储文件的列types是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}`); 

该文件已损坏,当然,如果我仔细看,上传的文件和我下载的文件是不同的。 请参阅hex截图,在下载的开始处有一些额外的数据: http : //imgur.com/a/kTRAB

经过一些更多的testing,我可以告诉问题在于koa部分,当我把缓冲区放入ctx.body。 它被损坏(???)

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

您不应该使用bytea作为常规文本string。 您应该直接inputBuffertypes,并让驱动程序正确地将其转义。

不知道您正在使用哪个驱动程序,但例如…

  • pg-promise自动执行,看例子
  • 节点postgres应该自动执行,它主要是做,但我知道有问题的数组, 最近在这里修复 。
  • massive.js – 基于v3.0以来的pg-promise ,所以同样的故事 – 它只是起作用。