本文作者:心月

php通过header方法实现文件下载

心月IT博客 2019-04-12
php通过header方法实现文件下载摘要:当用浏览器打开浏览器不支持的文件时会弹出下载提示框,但如果是浏览器支持打开的文件则会直接在浏览器中打开。但如果不想让它在浏览器中打开而是提示下载该怎么做呢?今天这里要给大家分下就是通过header实现文件的下载,包括文本文件、图片文件等可以在浏览器中直接打开的文件的下载。

    当用浏览器打开浏览器不支持的文件时会弹出下载提示框,但如果是浏览器支持打开的文件则会直接在浏览器中打开。但如果不想让它在浏览器中打开而是提示下载该怎么做呢?今天这里要给大家分下就是通过header实现文件的下载,包括文本文件、图片文件中文名文件等可以在浏览器中直接打开的文件的下载。


header实现文件下载的代码如下:

<?php

    header('Content-Type:text/html;charset=utf-8');

    if(!empty($_GET['filename'])){
        $filename = "uploadfile/".$_GET['filename'];
        $filename = iconv('utf-8', 'gbk', $filename);
        //中文文件名处理
        $name = str_replace([dirname($filename),'/','\\'], '', $filename);
        // $name = preg_replace('/^.+[\\\\\\/]/', '', $filename);
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' .$name);
        header('Content-length:'.filesize( $filename));
        readfile($filename);
    }
?>
<a href="?filename=轮播图.jpg">轮播图下载</a>


    看代码觉得php实现文件下载其实挺简单的,确实如此。只不过在实现文件下载的代码中有一些细节需要注意,否则会出现下载文件只有扩展名而没有文件名,或者下载的图片打不开,又或者下载的文件中出现了不应该出现的内容。

下面就来具体说说这些细节:

①'<?php'的位置问题

    '<?php'一定要放在文件最左上角的位置,在'<?php'前不能有空格、空行或者其他内容包括html注释等,否者'<?php'前的内容都会出现在下载文件中,比如图中所示,就是因为‘<a href="?filename=轮播图.jpg">轮播图下载</a>’放在了'<?php'之前,最终导致的结果就是图片打不开。

1.jpg

②编码问题

有2个编码问题

a.文件保存的编码格式要与设置的编码格式一致,否者下载也会出错。

b.$filename文件路径编码问题,如果文件用的是 utf-8 格式,一定要用iconv()函数把文件路径转为 gbk 或者 gb2312 ,因为 filesize() 函数对 utf-8 的文件路径识别不了。

文件编码问题

③保存文件名问题

    熟悉php的人都知道,用 basename() 函数可以直接获取文件名和扩展名,但如果文件名是纯中文, basename() 函数就不起作用获取不到文件名了。所以,在下载文件前还需要把文件名单独获取出来。

    这里分享两种比较实用的获取文件名包括扩展名的方法:

$name = str_replace([dirname($filename),'/','\\'], '', $filename);
$name = preg_replace('/^.+[\\\\\\/]/', '', $filename);

正则替换是在网上查的别人处理的方法。

第一个是我自己想到的方法。

    在php中有个 dirname() 函数可以获取文件路径,因此,我们可以把文件路径获取出来,然后在 $filename 中把路径替换为空,剩下的自然就是文件名和扩展了。

    但是 dirname() 获取路径时不会把最后一层路径的分割符获取,因此还需要把分隔符也替换掉,在 windows 系统中有两种分隔符 '/','\' ,为了防止两种分割符都用可能出现,所以把两种分割符都替换为空。


以上就是本次分享的通过header下载文件的所有内容。

文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-04-12
若转载请注明原文及出处:https://www.xinyueseo.com/other/236.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论