php实现对pdf的强制下载
来源:互联网 发布:淘宝退货被拒收怎么办 编辑:程序博客网 时间:2024/05/16 10:34
首先,我要感谢没有我的,只有你的,
为什么呢?纠结了两个小时来做pdf下载,但是都失败了
刚开始本来就准备在服务器端实现pdf的下载功能,但是都失败了,
最初我是参考hello威霸
http://www.helloweba.com/view-blog-103.html
在这篇文章里,他做成了函数,当然这都是小问题,问题是他的案例成功下载,但是我实现的时候总是下载为空文件
他的例子是这样的
forceDownload("pdfdemo.pdf"); function forceDownload($filename) { if (false == file_exists($filename)) { return false; } // http headers header('Content-Type: application-x/force-download'); header('Content-Disposition: attachment; filename="' . basename($filename) .'"'); header('Content-length: ' . filesize($filename)); // for IE6 if (false === strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6')) { header('Cache-Control: no-cache, must-revalidate'); } header('Pragma: no-cache'); // read file content and output return readfile($filename); }
并且网上参考了十几个案例,给的代码都差不多
好吧,我只能再找其他方法了
突然我想到了可以用a标签直接下载,我试了下后发现浏览器不是直接下载pdf的,而是进行了预览,
好吧,<a>标签是可以使用一个属性进行强制下载的,download属性,属性的值就是下载的文件名,具体可以参考w3cschool,
但是问题又出现了,这个属性的确很好用,能实现下载,但是只支持谷歌和火狐,我测试下高版本的ie也是支持的,
但是兼容性如此不好我也只能放弃,
还好最后我又找到了[http://blog.csdn.net/lqs745920569/article/details/51742397],这篇文章,
里面的代码解决了我的问题
它的案例是这样的
$fileurl = $_GET['file']; $fileurl_arr=explode("/",$fileurl); $filePath="./".$fileurl_arr[3]."/".$fileurl_arr[4]."/".$fileurl_arr[5]."/".$fileurl_arr[6]; $fileName=$fileurl_arr[6]; $file = fopen($filePath, "r"); // 打开文件 // 输入文件标签 if ($file) { Header("Content-type:application/pdf"); Header("Accept-Ranges: bytes"); Header("Accept-Length: " . filesize($filePath)); Header("Content-Disposition: attachment; filename=" . $fileName); // 输出文件内容 echo fread($file, filesize($filePath)); fclose($file); }
从这两个代码来看,貌似没什么差别,重点都是改变header来进行强制下载
但是有两个函数有些细微的差距
在第一个中使用的是readfile()函数
readfile() 函数输出一个文件。
该函数读入一个文件并写入到输出缓冲。
若成功,则返回从文件中读入的字节数
第二个中使用的是fread函数
fread() 函数读取文件(可安全用于二进制文件)。
fread(file,length)
返回所读取的字符串,如果出错返回 false。
这两个具体区别在于返回值不同,
并且官方提示:如果只是想将一个文件的内容读入到一个字符串中,请使用 file_get_contents(),它的性能比 fread() 好得多。
那么能不能使用file_get_contents代替f_read呢?我试了一下,果然能用,这就说明
readfile()
fread(file,length)
file_get_contents()
这三个函数都可以使用,但是推荐使用file_get_contents(),效率更高
-------------------------------------------------------------------------------------------------------------
那么既然上面的都能用,我究竟错在哪了呢
我的代码如下
public function downloadti(){ $resource = I('get.resource'); $link1 = 'http://'.$_SERVER['HTTP_HOST'].__ROOT__.'/Uploads/tifile/'.$resource; $link2 = __ROOT__.'/Uploads/tifile/'.$resource; $link3 = './Uploads/tifile/'.$resource; $file = fopen($link3, "r"); // 打开文件 // 输入文件标签 Header("Content-type:application/pdf"); Header("Accept-Ranges: bytes"); Header("Accept-Length: " . filesize($link3)); Header("Content-Disposition: attachment; filename=" . $resource); // 输出文件内容 //echo fread($file, filesize($link3)); //echo file_get_contents($link3); echo readfile($link3); fclose($file); }好吧,请注意$link1,$link2,$link3,
$link1 是我拼接的全路径,刚开始以为我的资源地址错了,就想着拼接全路径下载,这证明我错的多么彻底
$link2 是我拼接的根相对路径,这种路径还是不能有效下载
$link3 是相对路径,因为使用的tp框架,所以这属于相对路径,成功下载
-----------------------------------------------------------------------------------------------------------------
纠结了这么久竟然是路径理解错了,心累啊
注意:::路径一定要正确,并且是相对路径
- php实现对pdf的强制下载
- PHP强制下载PDF文件实现代码
- PHP强制下载PDF文件的例子
- php 强制下载pdf文件
- 使用PHP强制下载PDF文件
- PHP 实现文件强制下载
- php 实现批量的下载pdf (使用filedownload)
- php强制下载文件
- php 强制文件下载
- php简单强制下载
- 强制文件下载php
- PHP强制下载文件
- PHP强制下载文件
- php强制下载文件、文件强制下载、输出强制下载
- 用PHP实现手机对jar,jad文件的下载
- php 下载pdf
- php强制下载文件代码
- php强制下载文件函数
- Quake4裁剪关卡
- 2017.05.10回顾 numpy学习 其他python woe iv实现参考
- Android-解析xml:pull
- zigbee 协议栈 按键驱动
- 深度学习目标检测:RCNN,Fast,Faster,YOLO,SSD比较
- php实现对pdf的强制下载
- 转载 VB.NET delegate委托 Invoke
- linux常见系统调用函数列表
- 12个非常有用的JavaScript技巧
- android.intent.category.LAUNCHER 的作用
- jpa@version不起作用(更新时不自增)
- <模型汇总-6>堆叠自动编码器Stacked_AutoEncoder-SAE
- 【Java学习笔记】16.TreeMap集合实现斗地主洗牌发牌
- C++ 32位64位的区别