node.js - NodeJs/Express 在浏览器中显示 pdf 文件
问题描述
我正在处理 NodeJs/Express 项目,需要在存储在 browesr pdf 文件中显示
/公共/图像
这是相关的路由器代码:
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)
}
})
我没有收到任何错误,但什么也没发生,即浏览器未打开等。提前感谢您的任何指导。
解决方案
我要做的第一个更改是删除async
. 它只会用不需要的 Promises 弄乱代码。
其次,我消除了捕获异常的需要,使用fs.existsSync(path)
. 尽量不要经常出现异常。如果您知道某些事情可能会引发异常,请对其进行测试。
最后,也是最重要的,我创建了一个文件的读取流,并将结果通过管道传输到响应中fs.createReadStream(path).pipe(res)
。这样,客户端会在读取文件时接收文件,从而节省您的内存。非常适合大文件。
读取文件可能会占用大量内存,因此将其全部加载到内存中是一种不好的做法。您只需要少量请求即可使您的机器超载。
您可以在此处阅读有关管道方法的更多信息。
在此示例中,任何 GET 调用都/router/show_file
将返回 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'))
推荐阅读
- python - Json 转换为 csv 文件但数据没有逐列跟随
- python - 如何为 CustomMessage_AdminCreateUser 触发器发送自定义消息?
- angular - 有没有办法在禁用 CSRF 的同时保留 Spring 默认登录页面?
- angular - SASS 无效的属性值
- javascript - 在 Angular 8 应用程序中获取选项配置的打字稿错误
- java - 同步访问相同文件,并发访问不同文件
- c++ - 循环多个枚举
- javascript - 删除多行文本区域文本每行“-”之前的所有字符
- python - 如何将多个csv文件合并为1个文件
- javascript - 远程 Web 服务器对 HTML Web 表单没有 JSON 响应