讲完了《文件上传》,接下来讲一下 PHP 中如何下载文件。简单的文件下载只需要使用 HTML 的链接标记 <a>,并将 href 属性的值指定为要下载的文件路径即可,如下所示:
通过上面的方法实现文件下载的话,只能处理一些浏览器不能识别的类型文件,例如上面示例中用到的 zip 压缩文件,浏览器不能直接打开,所以会弹出一个下载提示,但如果将链接后面的文件改成后缀名为.html的网页文件、图片文件或者 PHP 程序脚本文件的话,使用这种链接形式,则会将文件内容直接输出到浏览器中,并不会提示用户下载。
为了避免要下载的文件直接在浏览器中输出,我们可以向浏览器发送一个头信息,用来通知浏览器进行下载文件的处理。在 PHP 中可以使用 header() 函数发送网页的头部信息给浏览器,该函数接受一个头信息的字符串作为参数,其语法格式如下:
其中,$string 就是头信息的字符串;$replace 为可选参数,用来设置是否使用后面的头信息替换前面相同类型的头信息,默认为 true;$http_response_code 为可选参数,用来强制指定 HTTP 响应的值。
要实现文件下载需要调用三次 header() 函数,下面是以下载图片 logo.jpg 为例,需要发送的头信息的代码如下所示:
在使用了 header() 函数向浏览器发送了这三行头信息之后,图片 logo.jpg 就不会直接在浏览器中输出了,而是在浏览器以文件的形式将其下载到本地。
头部信息中需要一些文件的属性信息,可以使用 PHP 中提供的函数来获取。设置完头部信息以后,需要将文件的内容输出到浏览器,以便进行下载。可以使用 PHP 中的文件系统函数将文件内容读取出来后,直接输出给浏览器。最方便的是使用 readfile() 函数,将文件内容读取出来并直接输出。
【示例】以下载图片 logo.jpg 为例,实现代码如下所示:
<?php
$file = 'logo.jpg';
header('Content-type:image/jpg'); // 发送指定文件 MIME 类型的头信息
header('Content-Disposition:attachment;filename="'.$file.'"'); // 发送描述文件的头信息,附件和文件名
header('Content-Length:'.filesize($file)); // 发送指定文件大小的信息,单位是字节
readfile($file);
?>
运行上面的代码即可将 logo.jpg 下载到本地。