以下载图片为例,隐藏服务器中资源文件的位置,防止客户端直接获取,并用超链接,下载图片到本地
源代码获取:
https://github.com/akh5/PHP/tree/master/day3
通过md5()函数,将需要的关键字加密为16字节的散列值,并同通过在地址栏上传参的方式,在php文件中获取该参数。
这也是为什么我们经常在网上下载图片时,图片的默认名称也是这种字母与数字组合的方式。
echo md5("dog")
返回: 06d80eb0c50b49a509b49f2424e8c805
通过md5函数得到的加密值,作为传递的参数值
<?php
//echo md5("dog");
$file = $_GET['f'];
$arr = array(
'06d80eb0c50b49a509b49f2424e8c805'=>array('./dog.jpg','dog.jpg')
);
通过$_GET(),获取地址中的参数值,通过数组将该加密的值对应另一个数组,数组的0号位对应的是存放当前资源的路径。1号元素对应的是下载时,默认的文件名称。
//浏览器内容为八位二进制数据流
header("Content-Type:application/octet-stream");
//数据处理方式为附件保存
header("Content-Disposition: attachment;filename=".$arr[$file][1]);
$handle = fopen($arr[$file][0],'rb');
$file_size = filesize($arr[$file][0]);
$filecount = 0;
while(!feof($handle)&&$filecount<$file_size)
{
$out = fread($handle,1024);
$filecount+=1024;
echo $out;
}
先要声明二进制数据的处理方式。第二个header通过字符串拼接的方式,可以默认下载时的文件名。然后读取文件$arr[$file][0]就可以取到图片的路径,并通过二进制的方式打开文件。并循环读取文件。直到读到文件末尾,并读取的数据量大于原文件本身大小时,结束。
整个过程不会在客户端上暴露资源位置。