一、前言
在各种网站中,我们经常会遇到一些需要文件下载的情境。比如,下载一些PDF文件、音乐、视频等等。对于这些下载需求,网站经常会设置为登录用户的专属文件下载中心。但是,对于某些站点并不想要用户注册登录,那么该如何才能实现游客的文件下载需求呢?这时候,我们能够用到PHP的内置方法来实现Guest下载功能。
二、PHP Guest下载信息获取
Guest下载始终有一定的安全风险,因此我们需要采取一些预防措施。比如,可以向PHP脚本提交SHA1哈希值或缩写的文件名。我们可以准备sha1码数组来匹配传递给脚本的哈希值或缩写,只有匹配成功才允许文件的下载。代码实现如下:
$down_files = array( 'file1'=>'file1.pdf.sha1', 'file2'=>'file2.docx.sha1', 'file3'=>'file3.zip.sha1' ); $down_folder = './download/'; if(isset( $_GET['file']) && isset($down_files[$_GET['file']])){ $sha1_file = $down_folder.$down_files[$_GET['file']]; if( file_exists($sha1_file)){ $sha1_code = trim(file_get_contents($sha1_file)); if(isset($_GET['hash']) && strlen($_GET['hash']) == strlen($sha1_code)){ if($_GET['hash'] == $sha1_code){ $file = $down_folder.$_GET['file']; if(file_exists($file)){ header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$_GET['file'].'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: '.filesize($file)); readfile($file); exit(); } } } } }
我们使用$get[‘file’]变量给脚本提供了下载文件的名称。此名称将从预定的数组中检索出文件名,并尝试加载与文件关联的SHA1哈希值(附加了“.sha1”的文件名)。如果文件存在,就检查web用户是否提供了一个有效的SHA1哈希值。如果是这样,我们就可以认为,用户已经获得了正确的HASH值,其确实可以下载该文件。
三、PHP Guest下载文件
下载一个文件来说,这个过程实际上非常简单。从业务需求的角度看,应该:
- 设置MIME类型并强制执行文件下载
- 通过缓冲读/写文件
- 返回数据流
我们将主要使用HTTP协议头来指定内容类型、内容长度和文件名等。当然,也可以使用文件扩展名自动映射到MIME类型,通俗点说就是浏览器知道这是文件类型并会弹出下载框。代码实现如下:
header('Content-Type: application/octet-stream'); // 指定为二进制流的内容类型 header('Content-Disposition: attachment; filename="'.$_GET['file'].'"'); // 强制下载 header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: '.filesize($file)); // 文件大小 readfile($file); // 读取文件内容
你可以使用header()函数也指定更多的头部信息,来提高代码的安全性和可维护性。但是需要注意的一点是:header()函数必须放在所有其他输出内容的前面。
四、结语
通过本文对PHP Guest下载的讲解,相信大家已经对这个特性有了更好的理解和掌握。在实际的网站开发中,我们也能够采用上述代码实现一个简单、高效的文件下载中心,让游客顺利地下载站点上的文件。