2017-07-15 88 views
1

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

  • 我正在使用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。它被损坏了(???)

编辑:我与扬鞭UI工作:https://github.com/swagger-api/swagger-ui/issues/1605

+0

我正在用Swagger客户端测试我的路线。当我通过在我的浏览器中调用url进行测试它的工作原理... – thesearentthedroids

回答

1

你不应该使用bytea作为一个普通的文本字符串。您应该直接输入Buffer,并让驱动程序正确地为您转义。

不知道你所使用的驱动程序,但如...

+0

我认为knexjs可以逃避缓冲区,因为它应该是。我不确定,所以我继续搜索,只用TEXT替换我的BYTEA列。所以现在我在我的缓冲区中使用.toString方法来存储它,然后当我使用Buffer.from(都在base 64中)检索数据来重新创建缓冲区时,我将它返回。我的文件仍然损坏(总是与我的屏幕截图相同的偏移量) – thesearentthedroids

+0

@thesearentthedroids这是一个非常糟糕的做法。您应该查询如何在knex中插入二进制数据,并将类型保留为'bytea'。我不能提供更多细节,因为我对自己不熟悉knex。 –