如安在浏览器中打开预览pdf,而不是下载

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

背景

上传了pdf文件之后,点击查看,跳转pdf的url,渴望是浏览器中预览,而不是直接下载
原理

必要pdf资源url的响应头是下面下面这2个属性
  1. Content-Type: application/pdf
  2. Content-Disposition: inline;
复制代码
怎样做


  • 如果pdf资源服务器是本身内部可修改的,那就让服务修改下响应头
  • 如果无法修改,可以本身写一个代理服务,服务端请求到资源后,修改响应头,在返回给客户端
代理服务的代码实现
请求方式:http://localhost:3000/get-pdf?url=http://xxxxx/xxxxx.pdf
注意:pdf资源的url不要使用https,否则会验签失败
  1. const http = require('http');
  2. const nodefetch = require('node-fetch');
  3. const PORT = 3000;
  4. const server = http.createServer(async (req, res) => {
  5.   if (req.url === '/get-pdf' && req.method === 'GET') {
  6.           let PDF_URL = req.query.url
  7.     let pass = await checkUrl(PDF_URL)
  8.     if (!pass) {
  9.             res.send('Not Found');
  10.         return
  11.     }
  12.     // 请求第三方PDF文件
  13.     let data = null
  14.     try {
  15.         data = await nodefetch(PDF_URL, {
  16.             method: "GET",
  17.             headers: {
  18.                 "Content-Type": "application/pdf",
  19.             }
  20.         })
  21.     } catch (error) {
  22.         data = {
  23.             body: 'error'
  24.         }
  25.     }
  26.     // 重点在这里
  27.     res.setHeader('Content-Type', 'application/pdf')
  28.     res.setHeader('Content-Disposition', 'inline')
  29.     data.body.pipe(res)
  30.   } else {
  31.     res.writeHead(404, { 'Content-Type': 'text/plain' });
  32.     res.end('Not Found');
  33.   }
  34. });
  35. function checkUrl(url){
  36.   // 可以配置白名单,或者域名校验一下
  37.   url = decodeURIComponent(url)
  38.    let domain = url.split('/')[2]
  39.   if (domain === 'localhost:3000'){
  40.         return true
  41.   } else {
  42.   return false
  43. }
  44. server.listen(PORT, () => {
  45.   console.log(`Server is listening on port ${PORT}`);
  46. });
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表