我正在研究NodeJs / Express项目,需要在存储在
中的browesr pdf文件中显示/ public / images
这是相关的路由器代码:
router.post('/show_file', async (req,res)=>{
try {
let path = './public/images/1.pdf'
var data =fs.readFileSync(path);
res.contentType("application/pdf");
res.send(data);
} catch (err) {
res.status(500)
console.log(err)
res.send(err.message)
}
})
我没有收到任何错误,但是什么也没发生,即浏览器没有打开等。 预先感谢您的指导。
答案 0 :(得分:3)
我要做的第一个更改是删除async
。它将用不必要的承诺弄乱代码。
第二,我删除了捕获异常的需要,并使用fs.existsSync(path)
验证了文件的存在。尽量不要引起异常。如果您知道某些情况可能引发异常,请对其进行测试。
最后也是最重要的一点,我创建了文件的读取流,并将结果通过fs.createReadStream(path).pipe(res)
用管道传输到响应。这样,客户端在读取文件时会收到文件,并且会保留您的内存。非常适合大文件。
读取文件可能会占用大量内存,因此将其全部加载到内存中是一种不好的做法。您只需要一堆请求就可以使计算机超载。
您可以阅读有关管道方法here的更多信息。
在此示例中,对/router/show_file
的任何GET调用都将返回pdf。
const express = require('express')
const app = express()
const fs = require('fs')
const router = express.Router()
router.get('/show_file', (req, res) => {
const path = './public/images/1.pdf'
if (fs.existsSync(path)) {
res.contentType("application/pdf");
fs.createReadStream(path).pipe(res)
} else {
res.status(500)
console.log('File not found')
res.send('File not found')
}
})
app.use('/router', router) // Here we pass the router to the app with a path
app.listen(9999, () => console.log('Listening to port 9999'))