会员中心
用户名:    密码:    验证码:      免费注册会员

jquery手册   CSS2手册       请关注健康

CSSer > 后台与数据库 > 用php实现文件安全下载

来源: 作者: 发布时间:2007-03-09
雅虎收藏夹 百度收藏 Google书签 Yahoo书签 新浪ViVi 搜狐网摘 365Key网摘 天极网摘 diglog 和讯网摘 POCO网摘 YouNote网摘 博拉网 天下图摘 Del.icio.us digg reddit spurl BlinkList blogmarks

最近在研究php实现文件下载的问题,按道理来说,一般的文件下载很简单,建立一个链接指向到目标文件就可以了,但是这样就直接暴露了文件所在路径,给盗链者打开了大门,并且可能会有安全隐患,一般来说,要实现安全的文件下载,在php下一般是利用header和fread这么来做的:
第一步
假设你要下载的是一个torrent的文件,那么先建立一个动态php文件,用户点击下载文件的时候直接链接到这个php并传回与文件位置相关的参数以帮助这个php能从数据库中取出文件所在的真实位置;这样做的另外一个好处是,可以通过这个php来对下载进行统计计数;这个过程并不难,所以就不写代码了,主要是对数据库的查询,假设文件的真实位置是$fileAdd,文件名为$fileName;
第二步
得到文件所在的真实位置以后,有人会用header的location直接重定向到这个文件,但是这样仍然是不安全的,因为某些下载软件还是可以通过重定向分析获得你的文件位置信息,因此需要用另外一种方法,就是php的文件处理API函数,这里主要是运用fread函数把文件直接吐给浏览器,让浏览器提示用户下载,所有的这些处理都是在服务器端完成的,因此用户是不会知道文件具体位置信息的,具体代码如下:

  1. Header("content-type:application/octet-stream");
  2. Header("content-disposition:attatchment;filename:".$fileName.".torrent");
  3. if(file_exists($fileAdd) && $file=fopen($fileAdd,"r"))//判断文件是否存在并打开
  4. {
  5. fread($file,filesize($fileAdd));//读取文件内容并吐给浏览器
  6. fclose($file);
  7. }

细心的朋友可能会发现为什么要在程序的前面加上一些header信息呢?
因为,这些信息是用来告诉apache和浏览器下载文件的相关信息的,第一个content-type是告诉apache我的文件MIME类型是文件流格式,如果你的apache配置里面把torrent的MIME类型设为了application/octet-stream(比如:add application/octet-stream .torrent),那么浏览器端就会知道这是一个torrent的文件并提示你下载,相反,如果apache没有做此类设置,浏览器将不会知道做如何处理而将此文件直接以文本形式打开,这就是为什么有时候文件下载的时候浏览器上会出现乱码了;
而第二个header发送的信息是用来告诉浏览器我的这个文件是可以当作附件被下载的,下载保存的名称为$fileName.torrent


相关文章

  • 网站建设之做网站后台的流程

    一、网站规划阶段 这个阶段主要是对网站的功能、目标受众、内容、栏目进行规划。这期间会经常性地和有关领导进行沟通。首

  • 详解SQL Server中数据库快照工作原理

    在SQL Server 2005中,它的另外一个强大的新特点是数据库快照。数据库快照是一个数据库的只读副本,它是数据库所有数据的

  • 全面了解数据库设计中分类算法

    分类算法要解决的问题 在网站建设中,分类算法的应用非常的普遍。在设计一个电子商店时,要涉及到商品分类;在设计发布系

  • 用PHP与XML进行网站编程

    一、小序 HTML简单易学又通用,一般的PHP程序就是嵌入在HTML语言之中实现的。但是随着WEB越来越广泛的应用,HTML的弱点也

  • PHP简易生成静态页面

    ?php /* * 文件名:index.php */ require conn.php; $query = select * from news order by datetime desc; $result = mys

  • 用PHP制作静态网站的模板框架

    模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构成的网站中巧妙地运用模板

  • MS SQL SERVER 基础教程——操作多个表

    到现在为止,你只尝试了用一句SQL查询从一个表中取出数据。你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELEC

  • PHP生成静态页面详解

    看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系 统,遂谈些看法,以供各位参考。好了,我