IE9环境下实现PDF文件下载而非浏览器打开的技术问题
解决IE9下PDF文件直接打开而非下载的问题
问题分析
你当前用的<a>标签download属性在IE9里不支持,而且浏览器默认会预览PDF文件,导致跳转到新视图,不符合需求。要同时实现TIFF和PDF在IE9里强制下载,得从后端响应头配置或者前端IE专属下载逻辑入手。
方案1:后端配置响应头(最优解)
直接在后端给PDF文件设置Content-Disposition响应头,让浏览器直接触发下载,不需要前端额外处理。
以ASP为例(你的代码里用了<%= %>,推测是ASP环境),输出文件时添加以下代码:
' 针对PDF文件设置响应头 Response.ContentType = "application/pdf" ' attachment表示强制下载,filename指定下载后的文件名 Response.AddHeader "Content-Disposition", "attachment; filename=""" & fileName & """" ' 输出文件内容的代码...
TIFF文件同理,不过浏览器一般不会预览TIFF,所以主要处理PDF即可。配置后,原有的<a>标签就能正常让IE9下载PDF,不会打开预览。
方案2:前端IE9专属下载逻辑(后端无法修改时用)
如果后端没法改,就用IE9支持的ActiveXObject来实现二进制文件下载,绕过浏览器预览机制。
步骤1:编写下载函数
function downloadFile(fileUrl, saveFileName) { // 检测是否是IE9 if (navigator.userAgent.indexOf('MSIE 9.0') > -1) { try { var xhr = new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("GET", fileUrl, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var stream = new ActiveXObject("ADODB.Stream"); stream.open(); stream.type = 1; // 设置为二进制流 stream.write(xhr.responseBody); stream.position = 0; // 2表示覆盖已存在的同名文件,1表示不覆盖 stream.saveToFile(saveFileName, 2); stream.close(); alert("文件已下载完成"); } }; xhr.send(); } catch (e) { alert("下载失败,请检查IE的ActiveX控件是否允许运行"); } } }
步骤2:修改<a>标签
把原来的链接改成调用这个函数:
<a href="javascript:void(0)" onclick="downloadFile('<%=fileName%>', '<%=fileName%>')"><%=fileName%></a>
注意事项
- IE9下需要用户允许ActiveX控件运行(默认可能禁用),如果没反应,让用户检查IE的「Internet选项」→「安全」→「自定义级别」里,启用「对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本」。
内容的提问来源于stack exchange,提问作者james2611nov
相关产品推荐
相关产品推荐

