PHP简单文件下载函数

php实现文件下载有许多的方法最多的就是直接显示文件路径了然后点击下载即可,另一种是利用header函数再由filesize与fopen读取文件进行下载了,这个可以实现限速下载了,但是个人认为使用header限速下载大文件是非常的不理想的,下面我们来看个例子.

例子,代码如下:

  1. <?php
  2. header("Content-Type; text/html; charset=utf-8");
  3. class DownFile {
  4. public static function File($_path,$file_name) {
  5. //解决中文乱码问题
  6. $_path=$_path.$file_name;
  7. //判断文件是否存在
  8. if (!file_exists($_path)) {
  9. exit('文件不存在');
  10. }
  11. $_path=iconv('utf-8','gb2312',$_path);
  12. $file_size=filesize($_path);
  13. $fp=fopen($_path,'r');
  14. header("Content-type: application/octet-stream");
  15. header("Accept-Ranges: bytes");
  16. header("Accept-Length: $file_name");
  17. header("Content-Disposition: attachment; filename=$file_name");
  18. $buffer=1024;
  19. $file_count=0;
  20. while (!feof($fp) && ($file_size-$file_count>0)) {
  21. $file_data=fread($fp,$buffer);
  22. $file_count+=$buffer;
  23. echo $file_data;
  24. }
  25. fclose($fp);
  26. }
  27. }
  28. //路径
  29. $path='../';
  30. //文件名
  31. $file_name='filelist.php';
  32. DownFile::File($path,$file_name);
  33. ?>

分析研究:使用header函数可以把像服务器端的脚本程序不需打包就可以进行下载了,像如php文件或html文件了,上面例子的核心语句是,代码如下:

  1. $_path=iconv('utf-8','gb2312',$_path);
  2. $file_size=filesize($_path);
  3. $fp=fopen($_path,'r');
  4. header("Content-type: application/octet-stream");
  5. header("Accept-Ranges: bytes");
  6. header("Accept-Length: $file_name");
  7. header("Content-Disposition: attachment; filename=$file_name");
  8. $buffer=1024;
  9. $file_count=0;
  10. while (!feof($fp) && ($file_size-$file_count>0)) {
  11. $file_data=fread($fp,$buffer);
  12. $file_count+=$buffer;
  13. echo $file_data;
  14. }

下面三句,一个转换文件名编码这个防止中文乱码,第一个是获取文件大小,第三个是使用fopen读取文件,代码如下:

  1. $_path=iconv('utf-8','gb2312',$_path);
  2. $file_size=filesize($_path);
  3. $fp=fopen($_path,'r');

下面几行代码是告诉浏览器我们要发送的文件是什么内容与文件名,代码如下:

  1. header("Content-type: application/octet-stream");
  2. header("Accept-Ranges: bytes");
  3. header("Accept-Length: $file_name");
  4. header("Content-Disposition: attachment; filename=$file_name");

下面三行是告诉我们最大下载不能超过1MB第秒,并且循环一直下载,直到文件下载完毕即可,代码如下:

  1. $buffer=1024;
  2. $file_count=0;
  3. while (!feof($fp) && ($file_size-$file_count>0)) {
  4. $file_data=fread($fp,$buffer);
  5. $file_count+=$buffer;
  6. echo $file_data;
  7. //开源代码phpfensi.com