如何使 pdf 文件在浏览器里面直接下载而不是打开
前言
在做需求过程中我们大概率会遇到在浏览器中下载文件的需求,如果仅仅是这个要求的话很简单,有如下两种解决方式。
第一种是通过 window 对象的 open 方法进行操作,将文件 url 直接在浏览器中打开即可下载。
window.open('url')
第二种是通过 a 标签,设置 href 为 url 值,点击 a 标签即可完成下载。
<a href='url' download='文件名'></a>
但是上面两种文件下载方式都会存在一个问题,就是 pdf 文件会直接在浏览器中打开而不是直接下载,效果如下:
解决方案
这种需求的解决方式就是将PDF文件的 MIME type 改为 application/octet-stream
并加入 Content-Disposition:attachment
header,原本的 pdf 文件 MIME type 为 application/pdf
,浏览器识别到这个 type 之后会自动在浏览器打开,所以说我们在这里修改 type 即可。
修改的方法有两种,一种是在后端进行修改,上传文件或者返回文件的时候进行操作,但是绝大多数情况下文件都是存储到 cdn 服务器中的,后端也不方便对其进行操作,这个时候就需要前端来修改了。
处理代码如下:
/**
* @deprecated 下载文件
* @param {string} url
* @param {string} filename
*/
handleFileDownload = (url, filename) => {
// 创建 a 标签
let a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
}
/**
* @deprecated 处理 pdf url,使其不在浏览器打开
* @param {string} url
*/
handlePdfLink = (url, filename) => {
fetch(url, {
method: 'get',
responseType: 'arraybuffer',
})
.then(function (res) {
if (res.status !== 200) {
return res.json()
}
return res.arrayBuffer()
})
.then((blobRes) => {
// 生成 Blob 对象,设置 type 等信息
const e = new Blob([blobRes], {
type: 'application/octet-stream',
'Content-Disposition':'attachment'
})
// 将 Blob 对象转为 url
const link = window.URL.createObjectURL(e)
handleFileDownload(link, filename)
}).catch(err => {
console.error(err)
})
}
作者:Jacob是我了
出处:https://www.cnblogs.com/Jacob98/p/directly-download-pdf.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性