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框架,所以这属于相对路径,成功下载

-----------------------------------------------------------------------------------------------------------------

纠结了这么久竟然是路径理解错了,心累啊

注意:::路径一定要正确,并且是相对路径












0 0
原创粉丝点击