【问题标题】:How to serve a file not saved in folder, stored in postgresql database, and to be rendered to HTML by expressjs?如何提供未保存在文件夹中、存储在 postgresql 数据库中并由 expressjs 呈现为 HTML 的文件?
【发布时间】:2022-01-23 03:20:20
【问题描述】:

我们先将要发布的文件发送如下:

router.post('/savefile', multer().single('filesource'), (q,s) => {  
     db.query("insert into filesource  (filerefid, source) values ($1, $2) returning filerefid",   [ q.body.filerefid,  q.file ])
      .then (r=> s.send(r.rows[0]))
  })

然后尝试在 HTML 中显示如下:

<object type="application/pdf" data="http://localhost:3000/getsource/1"></object>

请求者:

router.get('/getsource/:i', (q,s) => {
      db.query('select source from  filesource  where  filerefid = $1;',
               [q.params.i])
        .then (r=> s.send(Buffer.from(r.rows[0].source.buffer)))
    
})

但是文件不能像那样正确显示或下载,最好的方法是什么,而不将文件保存在任何目录中?

【问题讨论】:

    标签: node.js postgresql express multer node-postgres


    【解决方案1】:

    我想您在响应中缺少内容类型标头。

    res.set('Content-Type', 'application/pdf');
    

    还可以考虑设置Content-Disposition 标头以显示正确的文件名。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

    Content-Type: application/pdf
    Content-Disposition: attachment; filename="file.pdf"
    

    更新

    multer 提供的file 属性是一个js 对象,其中包含带有文件二进制数据的buffer 属性。在 http get 方法中,这个二进制数据应该由上面提到的所需的 http headers 修饰。

    【讨论】:

    • 这样做了,我们仍然收到了无法打开的模糊二进制文件,不确定是因为我们将其插入数据库的方式还是将其发送回的方式。
    • 尝试将二进制文件保存到文件中,然后打开它。如果能打开,问题出在get端点。
    • 您的q.file 是一个对象,其中包含字段buffer 中的二进制数据。在 get 方法中,您必须返回此二进制数据,而不是 js 对象。正如我之前所说,检查数据库中保存的内容,然后决定是否需要原始名称、编码、字段名称等元数据字段。通常,要提供 pdf,您只需要 q.file.buffer 内容
    • 好吧!尝试将文件写为 fs.writeFile(__dirname+'/xyz.pdf', r.rows[0].source, (err) => { if (err) throw err; console.log('文件已保存!'); });文件保存不好,
    • 谢谢您的通知
    【解决方案2】:

    正如 Oleg Flores 对正确标题的回答以及他的评论中提到的,我们应该使用对象中的缓冲区,在 Multer 不保存任何文件的情况下,插入查询的值应该是

    [ q.body.filerefid,  q.file.buffer]
    

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      相关资源
      最近更新 更多