最近在研究php实现文件下载的问题,按道理来说,一般的文件下载很简单,建立一个链接指向到目标文件就可以了,但是这样就直接暴露了文件所在路径,给盗链者打开了大门,并且可能会有安全隐患,一般来说,要实现安全的文件下载,在php下一般是利用header和fread这么来做的:
第一步
假设你要下载的是一个torrent的文件,那么先建立一个动态php文件,用户点击下载文件的时候直接链接到这个php并传回与文件位置相关的参数以帮助这个php能从数据库中取出文件所在的真实位置;这样做的另外一个好处是,可以通过这个php来对下载进行统计计数;这个过程并不难,所以就不写代码了,主要是对数据库的查询,假设文件的真实位置是$fileAdd,文件名为$fileName;
第二步
得到文件所在的真实位置以后,有人会用header的location直接重定向到这个文件,但是这样仍然是不安全的,因为某些下载软件还是可以通过重定向分析获得你的文件位置信息,因此需要用另外一种方法,就是php的文件处理API函数,这里主要是运用fread函数把文件直接吐给浏览器,让浏览器提示用户下载,所有的这些处理都是在服务器端完成的,因此用户是不会知道文件具体位置信息的,具体代码如下:
Header("content-type:application/octet-stream");
Header("content-disposition:attatchment;filename:".$fileName.".torrent");
if(file_exists($fileAdd) && $file=fopen($fileAdd,"r"))//判断文件是否存在并打开
{
fread($file,filesize($fileAdd));//读取文件内容并吐给浏览器
fclose($file);
}
细心的朋友可能会发现为什么要在程序的前面加上一些header信息呢?
因为,这些信息是用来告诉apache和浏览器下载文件的相关信息的,第一个content-type是告诉apache我的文件MIME类型是文件流格式,如果你的apache配置里面把torrent的MIME类型设为了application/octet-stream(比如:add application/octet-stream .torrent),那么浏览器端就会知道这是一个torrent的文件并提示你下载,相反,如果apache没有做此类设置,浏览器将不会知道做如何处理而将此文件直接以文本形式打开,这就是为什么有时候文件下载的时候浏览器上会出现乱码了;php手机版下载
而第二个header发送的信息是用来告诉浏览器我的这个文件是可以当作附件被下载的,下载保存的名称为$t
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论