如何提供未保存在文件夹中、存储在 postgresql 数据库中并由 expressjs 呈现为 HTML 的文件?
How to serve a file not saved in folder, stored in postgresql database, and to be rendered to HTML by expressjs?
我们先将要发布的文件发送如下:
router.post('/savefile', multer().single('filesource'), (q,s) => {
db.query("insert into filesource (filerefid, source) values (, ) 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 = ;',
[q.params.i])
.then (r=> s.send(Buffer.from(r.rows[0].source.buffer)))
})
但是文件无法像那样正确显示或下载,最好的方法是什么,而不将文件保存在任何目录中?
我想您在响应中缺少内容类型 header。
res.set('Content-Type', 'application/pdf');
同时考虑设置 Content-Disposition
header 以提供正确的文件名。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
Content-Type: application/pdf
Content-Disposition: attachment; filename="file.pdf"
更新
multer提供的file
属性是一个jsobject,其中包含buffer
属性和文件的二进制数据。在 http get 方法中,此二进制数据应返回由上述所需的 http headers 修饰。
正如 Oleg Flores 对正确 header 的回答所提到的,以及他评论中的通知,我们应该使用 object 中的缓冲区,在不保存任何文件的情况下Multer,插入查询的值应该是
[ q.body.filerefid, q.file.buffer]
我们先将要发布的文件发送如下:
router.post('/savefile', multer().single('filesource'), (q,s) => {
db.query("insert into filesource (filerefid, source) values (, ) 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 = ;',
[q.params.i])
.then (r=> s.send(Buffer.from(r.rows[0].source.buffer)))
})
但是文件无法像那样正确显示或下载,最好的方法是什么,而不将文件保存在任何目录中?
我想您在响应中缺少内容类型 header。
res.set('Content-Type', 'application/pdf');
同时考虑设置 Content-Disposition
header 以提供正确的文件名。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
Content-Type: application/pdf
Content-Disposition: attachment; filename="file.pdf"
更新
multer提供的file
属性是一个jsobject,其中包含buffer
属性和文件的二进制数据。在 http get 方法中,此二进制数据应返回由上述所需的 http headers 修饰。
正如 Oleg Flores 对正确 header 的回答所提到的,以及他评论中的通知,我们应该使用 object 中的缓冲区,在不保存任何文件的情况下Multer,插入查询的值应该是
[ q.body.filerefid, q.file.buffer]