VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • php实现文件下载功能的几个代码分享

我们一般实现下载都是调用url来下载,但是遇到ie能识别打开的文件就不能用这种方式了,比如下载一个图片、html网页等,这时就需要编程来实现。

一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了。php下载文件其实用一个a标签就能实现,比如 <a href="web/magento-1.8.1.0.zip">magento-1.8.1.0.zip</a> 。但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用<a href="web/abc.txt">abc.txt</a> 想必也知道会发生什么了,代码如下:

  1. <?php 
  2. /** 
  3.  * 文件下载 
  4.  * 
  5. **/ 
  6.  
  7. header("Content-type:text/html;charset=utf-8"); 
  8. download('web/magento-1.8.1.0.zip''magento下载'); 
  9.  
  10. function download($file$down_name){ 
  11.  $suffix = substr($file,strrpos($file,'.')); //获取文件后缀 
  12.  $down_name = $down_name.$suffix//新文件名,就是下载后的名字 
  13.  
  14.  //判断给定的文件存在与否 
  15.  if(!file_exists($file)){ 
  16.   die("您要下载的文件已不存在,可能是被删除"); 
  17.  } 
  18.  $fp = fopen($file,"r"); 
  19.  $file_size = filesize($file); 
  20.  //下载文件需要用到的头 
  21.  header("Content-type: application/octet-stream"); 
  22.  header("Accept-Ranges: bytes"); 
  23.  header("Accept-Length:".$file_size); 
  24.  header("Content-Disposition: attachment; filename=".$down_name); 
  25.  $buffer = 1024; 
  26.  $file_count = 0; 
  27.  //向浏览器返回数据 
  28.  while(!feof($fp) && $file_count < $file_size){ 
  29.   $file_con = fread($fp,$buffer); 
  30.   $file_count += $buffer
  31.   echo $file_con
  32.  } //phpfensi.com 
  33.  fclose($fp); 
  34.  
  35. ?> 

也可以看看这个注释比较详细的代码:

  1. <?php 
  2.  //文件下载,下载一张图片 
  3.  //$file_name="Angel.mp3"; 
  4.  $file_name="bjnihao.jpg";  //出现中文 程序无法完成下载 提示:文件不存在 
  5.  //对文件进行转码(PHP文件函数 比较古老 需对中文码转成 gb2312) 
  6.  //iconv — Convert string to requested character encoding 
  7.  //by www.phpfensi.com 
  8.  $file_name=iconv("utf-8","gb2312",$file_name); 
  9.  
  10.  //设置文件下载路径(相对路径) 
  11.  //$file_path="./dowm/".$file_name; 
  12.  
  13.  //使用绝对路径 
  14.  $file_path=$_SERVER['DOCUMENT_ROOT']."/http/dowm/".$file_name
  15.  
  16.  //打开文件---先判断再操作 
  17.  if(!file_exists($file_path)){ 
  18.  
  19.   echo "文件不存在"
  20.   return ; //直接退出 
  21.  } 
  22.  
  23.  //存在--打开文件 
  24.  
  25.  $fp=fopen($file_path,"r"); 
  26.  
  27.  //获取文件大小 
  28.  $file_size=filesize($file_path); 
  29.  
  30.  //http 下载需要的响应头 
  31.  header("Content-type: application/octet-stream"); //返回的文件 
  32.  header("Accept-Ranges: bytes");   //按照字节大小返回 
  33.  header("Accept-Length: $file_size"); //返回文件大小 
  34.  header("Content-Disposition: attachment; filename=".$file_name);//这里客户端的弹出对话框,对应的文件名 
  35.  
  36.  //向客户端返回数据 
  37.  //设置大小输出 
  38.  $buffer=1024; 
  39.  
  40.  //为了下载安全,我们最好做一个文件字节读取计数器 
  41.  $file_count=0; 
  42.  //判断文件指针是否到了文件结束的位置(读取文件是否结束) 
  43.  while(!feof($fp) && ($file_size-$file_count)>0){ 
  44.  
  45.   $file_data=fread($fp,$buffer); 
  46.   //统计读取多少个字节数 
  47.   $file_count+=$buffer
  48.   //把部分数据返回给浏览器 
  49.   echo $file_data
  50.  } 
  51.  //关闭文件 
  52.  
  53.  fclose($fp); 
  54. ?> 

封装函数:

  1. <?php 
  2.  /* 
  3.   封装函数: 
  4.   参数说明----$file_name:文件名 
  5.      $file_sub_dir:文件下载的子路径 
  6.  */ 
  7.  function file_dowm($file_name,$file_sub_dir){ 
  8.   //文件转码 
  9.   $file_name=iconv("utf-8","gb2312",$file_name); 
  10.  
  11.   //使用绝对路径 
  12.   $file_path=$_SERVER['DOCUMENT_ROOT']."$file_sub_dir".$file_name
  13.  
  14.   //打开文件---先判断再操作 
  15.   if(!file_exists($file_path)){ 
  16.  
  17.    echo "文件不存在"
  18.    return ; //直接退出 
  19.   } 
  20.  
  21.   //存在--打开文件 
  22.  
  23.   $fp=fopen($file_path,"r"); 
  24.  
  25.   //获取文件大小 
  26.   $file_size=filesize($file_path); 
  27.   /* 
  28.   //这里可以设置超过多大不能下载 
  29.   if($file_size>50){ 
  30.    echo "文件太大不能下载"; 
  31.    return ; 
  32.   }*/ 
  33.  
  34.   //http 下载需要的响应头 
  35.   header("Content-type: application/octet-stream"); //返回的文件 
  36.   header("Accept-Ranges: bytes");   //按照字节大小返回 
  37.   header("Accept-Length: $file_size"); //返回文件大小 
  38.   header("Content-Disposition: attachment; filename=".$file_name);//这里客户端的弹出对话框,对应的文件名 
  39.  
  40.   //向客户端返回数据 
  41.   //设置大小输出 
  42.   $buffer=1024; 
  43.  
  44.   //为了下载安全,我们最好做一个文件字节读取计数器 
  45.   $file_count=0; 
  46.   //判断文件指针是否到了文件结束的位置(读取文件是否结束) 
  47.   while(!feof($fp) && ($file_size-$file_count)>0){ 
  48.  
  49.    $file_data=fread($fp,$buffer); 
  50.    //统计读取多少个字节数 
  51.    $file_count+=$buffer
  52.    //把部分数据返回给浏览器 
  53.    echo $file_data
  54.   } 
  55.  
  56.   //关闭文件 
  57.   fclose($fp); 
  58.  } 
  59.  
  60.  file_dowm("bjnihao.jpg","/http/dowm/"); 
  61. ?> 

另一个代码:

  1. public function downloads($name){ 
  2.   $name_tmp = explode("_",$name); 
  3.   $type = $name_tmp[0]; 
  4.   $file_time = explode(".",$name_tmp[3]); 
  5.   $file_time = $file_time[0]; 
  6.   $file_date = date("Y/md",$file_time); 
  7.   $file_dir = SITE_PATH."/data/uploads/$type/$file_date/";  
  8.  
  9.   if (!file_exists($file_dir.$name)){ 
  10.    header("Content-type: text/html; charset=utf-8"); 
  11.    echo "File not found!"
  12.    exit
  13.   } else { 
  14.    $file = fopen($file_dir.$name,"r"); 
  15.    Header("Content-type: application/octet-stream"); 
  16.    Header("Accept-Ranges: bytes"); 
  17.    Header("Accept-Length: ".filesize($file_dir . $name)); 
  18.    Header("Content-Disposition: attachment; filename=".$name); 
  19.    echo fread($filefilesize($file_dir.$name)); 
  20.    fclose($file); 
  21.   } 
  22.  } 
  23.  



出处:http://www.phpfensi.com/php/20201212/13534.html


相关教程