最近做了一个下载pdf文档的需求,本以为使用HTML5中<a>标签的属性download就能简单搞定,不料IE竟然不支持这一简单粗暴的H5新特性,而是直接在网页中打开,

于是各种搜索之后得出以下结论:IE中下载文档时,要想直接下载而不是在浏览器中打开,就要给下载的请求添加一些header属性:

1、Content-Disposition: attachment; filename=filename
2、Content-Type: application/octet-stream;

现在以我做的项目为例,总结一下在IE中下载pdf等类型文档的方法:

1、服务器端语言:PHP

2、前端语言:Jquery

因为要设置header,所以只能走服务器

第一步:前端创建一个下载文件的按钮

<button class="btn btn-small btn-warning"  id="df">下载pdf文档</button>

这里面的class是bootstrap中的样式,用过bootstrap的人应该都很熟悉,这里不再赘述

第二步:给这个按钮添加点击事件,当点击该按钮时发起一个下载文档的请求给服务器

$("#df").click(function(){$.ajax({url:"downloadFile",type : 'POST',dataType : 'json',success : function (m) {if (m.status == 1) {location.href = "downloadFile"    } else {showAlert(m.info);}}});
});

这里使用ajax请求,downloadFile为请求的服务端方法,当服务器接收到该请求之后就会做出响应,即下一步

第三步:服务器接受并响应请求

public function downloadHelp(){/*设置文档的路径*/$fileDir = SERVER_PATH . 'static/help/';if (IS_POST) {if (!is_dir($fileDir)) {mkdir($fileDir, 0777, true);}$filePath = $fileDir . '下载文档.pdf';if (!is_file($filePath)) {$this->ajax_return(0,"文档不存在");} else if (!is_readable($filePath)) {$this->ajax_return(0,"文档不可读");} else {$this->ajax_return(1);}} else {$ua = $_SERVER["HTTP_USER_AGENT"];$fileName = '下载文档.pdf';$encoded_filename = urlencode($fileName);$encoded_filename = str_replace("+", "%20", $encoded_filename);$url = $fileDir . $fileName;$fileSize = filesize($url);header("Cache-Control: private");header("Content-Type: application/octet-stream;");header("Accept-Ranges: bytes");header("Accept-Length: " . $fileSize * 1024);/** 根据浏览器设置下载文件名称为中文时的编码*/if (preg_match("/MSIE/", $ua) || strpos($ua,"rv:11.0")) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); } else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition: attachment; filename*="utf8\'\'' . $fileName . '"'); } else { header('Content-Disposition: attachment; filename="' . $fileName . '"'); } readfile($url);exit;}
}    

上面代码中的方法其实是完成了两次客户端请求,

1、第一次请求方式是POST(可见js代码中的ajax请求),所以这时会判断文件是否存在以及是否具有读取权限等
2、第二次请求方式是GET,所以这时会根据第一次请求的结果决定下一步

(1)当staus="0",,提示"文档不存在" or "文档不可读"

   (2)当status="1",设置header,并输出文件

其中值得注意的是,当下载的文件名为中文,且字符编码是UTF-8时,要根据浏览器类型进行设置,否则会出现文件名乱码的情况,上面的代码中已解决该问题,但是方法不止这一种,

所以再贴出解决下载文件名中文乱码的两种方法:

公共部分:
$ua = $_SERVER["HTTP_USER_AGENT"];
$fileName = '下载文档.pdf';
$encoded_filename = urlencode($fileName);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
$url = $fileDir . $fileName;第一种方法:
if (strpos($ua,"MSIE") || strpos($ua,"rv:11.0")) {header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');} else if (strpos($ua,"Firefox")) {header('Content-Disposition: attachment; filename*="utf8\'\'' . $fileName . '"');}else {header('Content-Disposition: attachment; filename="' . $fileName . '"');}第二种方法:
if (preg_match("/MSIE/", $ua) || strpos($ua,"rv:11.0")) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition: attachment; filename*="utf8\'\'' . $fileName . '"');
} else { header('Content-Disposition: attachment; filename="' . $fileName . '"');
} 

其实这两种方法本质上没什么区别,只是我在测试的过程中发现,通过 $_SERVER["HTTP_USER_AGENT"]获取的浏览器信息中,如果浏览器是IE(我用的是IE11),

就没有“MSIE”这个字符串,导致即便是IE,strpos($ua,"MSIE")方法的结果还是false,所以无法解决IE中的乱码问题,于是就用strpos($ua,"MSIE")和preg_match("/MSIE/", $ua) 两种方法,

并在两种方法中都加上 strpos($ua,"rv:11.0"),这样才能判断出是IE浏览器,也就能顺利解决IE中文件名称中文乱码问题了。

以上就是本次下载pdf文档的需求中总结出的,本以为是个很简单的功能,没想到当它涉及到浏览器时竟有如此多的学问。

转载于:https://www.cnblogs.com/hellowhy/p/6395147.html

项目中的那些事---下载pdf文件相关推荐

  1. vue项目中使用a标签下载视频文件

    vue项目中使用a标签下载视频文件 前提条件: 1.地址为http 2.文件格式为MP4(仅代表这次项目中使用的情况) 示例代码: <el-button size="mini" ...

  2. 安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开

    安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开 前提: 高版本想使用Uri.fromFile() file://的形式 需要在onCreate 或init方法中添加下面代码. ...

  3. php+预览和下载pdf文件,vue实现在线预览pdf文件和下载(pdf.js)

    最近做项目遇到在线预览和下载pdf文件,试了多种pdf插件,例如jquery.media.js(ie无法直接浏览) 最后选择了pdf.js插件(兼容ie10及以上.谷歌.安卓,苹果) 强烈推荐改插件, ...

  4. 一步一步教你用Python爬虫框架Scrapy下载Pdf文件

    哈喽,感谢你在这寂寞的晚上看到这篇寂寞的文章.今天接到朋友的一个需求,下载pdf文件并且用网络上的书名保存.想到下载pdf文件啊,虽然requests也能实现,但是速度还是太慢了,于是乎,Scrapy ...

  5. 关于Java项目中,word和Excel类型文件的预览功能实现

    关于Java项目中,word和Excel类型文件的预览功能实现 背景 Aspose说明 Aspose.Words Aspose.Cells pom依赖引入 引入license.xml(授权文件) 创建 ...

  6. 微信公众号内,实现下载 PDF 文件。

    背景:需要在 微信公众号 内实现,通过点击一个[下载PDF文件]按钮,预期将 PDF 文件下载到本地自行打印. 前言:首先,本文采用的是 配合 后端 的实现方案.后端 返回file文件,通过 a 链接 ...

  7. java从页面下载pdf文件到本地

    java从页面下载pdf文件,strtus2为例,其他框架语法大致一样 直接上代码 这边我传了个参数 从数据库中查出来文件存在服务器的相对路径 页面 <button class="la ...

  8. 使用js直接下载pdf文件而不用在新的浏览器窗口打开

    最近接了一个需求,要求用户点击下载按钮后直接下载pdf文件,而不是打开一个新窗口,让用户再去手动保存. 接到需求后我立刻着手在网上查找文档,发现很多声称可以实现直接下载的方法都不行,只有下面这个方法成 ...

  9. Linux无法阅读caj文件解决办法之一(下载pdf文件)

    在FireFox浏览器上直接安装下面链接中的脚本,然后重启浏览器就可以下载pdf文件了 https://greasyfork.org/zh-CN/scripts/389343-%E4%B8%AD%E5 ...

最新文章

  1. CVPR 2018 《High-speed Tracking with Multi-kernel Correlation Filters》论文笔记
  2. wordpress的API end point
  3. 代码整洁之道(Clean Code)- 读书笔记
  4. 极光推送android点击跳转页面,app关闭时点击推送消息实现页面跳转
  5. 如何在CentOS上设置MariaDB Galera Cluster 10.0
  6. JavaScript--我所理解的原型链
  7. 开发smartphone应用,无法生成cab文件?
  8. android眼动追踪开源,Eyeboard:低成本的开源眼动跟踪解决方案
  9. 转:正则表达式简介及在C++11中的简单使用
  10. 2022年12个开源物联网平台对比(2022年9月20日更新)
  11. redis+哨兵+VIP(一主一从两哨兵)
  12. 【小程序】开发需要注意的地方(三)
  13. 混合精度训练、分布式训练等训练加速方法
  14. Java web:基于jieba分词器(或ansj分词器)的文章关键词字符云(词云图)
  15. 无忌典藏《生态系列奥赛金奖》百度首发
  16. 7-6 统计字母出现的次数 (20 分)
  17. OrCAD导入元件原理图符号流程
  18. Kettle的一些常见问题
  19. 2.2.1 定点数的表示 原码 反码 补码 移码
  20. Unity下载中文文档

热门文章

  1. 【python 8】python 装饰器
  2. 目标检测系列(五)——Faster R-CNN译文
  3. Flutter 性能分析
  4. 人造肉真的上市了,这对养殖业会有什么影响?
  5. 30几岁该有多少存款才算合格?
  6. 看“意大利文艺复兴艺术展”(1)
  7. PIC32单片机harmony开发环境搭建并新建harmony工程
  8. php传二维数组,JS用POST怎么传送二维数组给PHP
  9. 计算机科学与技术博士论文,计算机科学与技术系博士学位论文答辩.PDF
  10. signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery