当用浏览器打开浏览器不支持的文件时会弹出下载提示框,但如果是浏览器支持打开的文件则会直接在浏览器中打开。但如果不想让它在浏览器中打开而是提示下载该怎么做呢?今天这里要给大家分下就是通过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'之前,最终导致的结果就是图片打不开。
②编码问题
有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下载文件的所有内容。