Node.js Nodejs,将bin文件作为BYTEA存储到pgsql中(已损坏的文件)

Node.js Nodejs,将bin文件作为BYTEA存储到pgsql中(已损坏的文件),node.js,postgresql,buffer,koa,koa2,Node.js,Postgresql,Buffer,Koa,Koa2,出于某种原因,我需要将一些文件(主要是图像或PDF)存储到我的数据库中(第9.2.20页)。 这些文件是由用户上传的,当我下载回来时,它们被破坏了 我和nodejs一起工作 我存储文件的列类型是BYTEA 这就是我存储它们的方式: const { files, fields } = await asyncBusboy(ctx.req); const fileName = files[0].filename; const mimeType = files[0].mimeType; const

出于某种原因,我需要将一些文件(主要是图像或PDF)存储到我的数据库中(第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}`);
该文件已损坏,当然,如果我仔细查看,上传的文件和下载的文件是不同的。 请参阅hex屏幕截图,在下载的屏幕截图开始处有一些附加数据:

<> P>在我把缓冲区放入CTX.体之后,再经过一些测试,我可以把问题归结为膝关节炎。它被破坏了(???)


编辑:我正在使用Swagger用户界面:

您不应该将
bytea
用作常规文本字符串。你应该直接输入
Buffer
,并让司机为你正确转义

不确定您正在使用哪个驱动程序,但例如

  • 它是自动的吗
  • 应该是自动执行的,它主要是这样做的,但我知道数组有问题
  • -基于v3.0版,所以同样的故事-它只是工作

我认为knexjs应该是逃逸缓冲区。我不确定,所以我继续搜索,将我的BYTEA列替换为一个文本列。所以现在我在缓冲区上使用.toString方法来存储它,然后当我检索数据时,我使用buffer.from(都在base 64中)来重新创建缓冲区,然后返回它。我的文件仍然损坏(偏移量始终与我的屏幕截图相同)@thesearenthedroids这是一个非常糟糕的方法。您应该询问如何在knex中插入二进制数据,并将类型保持为
bytea
。我不能提供更多细节,因为我自己对knex不熟悉。@vitaly-t,所以说清楚,您建议将缓冲区保存在“text”postgreSQL列中?nodejs中的pbkdf2生成缓冲区,我想将其存储在postgreSQL中。我四处寻找,找到了你的答案。Thanks@slevin不,我从来没提过。您通常使用type
bytea
,并直接保存type
Buffer
,让库自动转义它。我正在用Swagger客户端测试我的路由。当我在浏览器中调用url进行测试时,它会工作。。。