如何为未保存在文件夹中、存储在postgresql数据库中并由expressjs呈现为HTML的文件提供服务



我们首先发送的文件如下:

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

})

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

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

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头来修饰返回。

正如Oleg Flores在评论中提到的,我们应该使用对象的缓冲区,在Multer没有保存任何文件的情况下,插入查询的值应该是

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

最新更新