php实现文件下载功能的几个代码分享


Posted in PHP onMay 10, 2014

一个简单的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> 想必也知道会发生什么了。

<?php 
/**
 * 文件下载
 *
**/
header("Content-type:text/html;charset=utf-8");
download('web/magento-1.8.1.0.zip', 'magento下载');
function download($file, $down_name){
 $suffix = substr($file,strrpos($file,'.')); //获取文件后缀
 $down_name = $down_name.$suffix; //新文件名,就是下载后的名字
 //判断给定的文件存在与否 
 if(!file_exists($file)){
  die("您要下载的文件已不存在,可能是被删除");
 } 
 $fp = fopen($file,"r");
 $file_size = filesize($file);
 //下载文件需要用到的头
 header("Content-type: application/octet-stream");
 header("Accept-Ranges: bytes");
 header("Accept-Length:".$file_size);
 header("Content-Disposition: attachment; filename=".$down_name);
 $buffer = 1024;
 $file_count = 0;
 //向浏览器返回数据 
 while(!feof($fp) && $file_count < $file_size){
  $file_con = fread($fp,$buffer);
  $file_count += $buffer;
  echo $file_con;
 } 
 fclose($fp);
}
?>

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

<?php
 //文件下载,下载一张图片
 //$file_name="Angel.mp3";
 $file_name="bjnihao.jpg";  //出现中文 程序无法完成下载 提示:文件不存在 
 //对文件进行转码(PHP文件函数 比较古老 需对中文码转成 gb2312)
 //iconv — Convert string to requested character encoding
 //by 3water.com
 $file_name=iconv("utf-8","gb2312",$file_name);
 //设置文件下载路径(相对路径)
 //$file_path="./dowm/".$file_name;
 //使用绝对路径
 $file_path=$_SERVER['DOCUMENT_ROOT']."/http/dowm/".$file_name;
 //打开文件---先判断再操作
 if(!file_exists($file_path)){
  echo "文件不存在";
  return ; //直接退出
 }
 //存在--打开文件
 $fp=fopen($file_path,"r");
 //获取文件大小
 $file_size=filesize($file_path);
 //http 下载需要的响应头 
 header("Content-type: application/octet-stream"); //返回的文件 
 header("Accept-Ranges: bytes");   //按照字节大小返回
 header("Accept-Length: $file_size"); //返回文件大小
 header("Content-Disposition: attachment; filename=".$file_name);//这里客户端的弹出对话框,对应的文件名
 //向客户端返回数据
 //设置大小输出
 $buffer=1024;
 //为了下载安全,我们最好做一个文件字节读取计数器
 $file_count=0;
 //判断文件指针是否到了文件结束的位置(读取文件是否结束)
 while(!feof($fp) && ($file_size-$file_count)>0){
  $file_data=fread($fp,$buffer);
  //统计读取多少个字节数
  $file_count+=$buffer;
  //把部分数据返回给浏览器
  echo $file_data;
 }
 //关闭文件
 fclose($fp);
?>

封装函数:

<?php
 /*
  封装函数:
  参数说明----$file_name:文件名
     $file_sub_dir:文件下载的子路径
 */
 function file_dowm($file_name,$file_sub_dir){
  //文件转码
  $file_name=iconv("utf-8","gb2312",$file_name);

  //使用绝对路径
  $file_path=$_SERVER['DOCUMENT_ROOT']."$file_sub_dir".$file_name;

  //打开文件---先判断再操作
  if(!file_exists($file_path)){

   echo "文件不存在";
   return ; //直接退出
  }

  //存在--打开文件

  $fp=fopen($file_path,"r");

  //获取文件大小
  $file_size=filesize($file_path);
  /*
  //这里可以设置超过多大不能下载
  if($file_size>50){
   echo "文件太大不能下载";
   return ;
  }*/

  //http 下载需要的响应头
  header("Content-type: application/octet-stream"); //返回的文件
  header("Accept-Ranges: bytes");   //按照字节大小返回
  header("Accept-Length: $file_size"); //返回文件大小
  header("Content-Disposition: attachment; filename=".$file_name);//这里客户端的弹出对话框,对应的文件名

  //向客户端返回数据
  //设置大小输出
  $buffer=1024;

  //为了下载安全,我们最好做一个文件字节读取计数器
  $file_count=0;
  //判断文件指针是否到了文件结束的位置(读取文件是否结束)
  while(!feof($fp) && ($file_size-$file_count)>0){

   $file_data=fread($fp,$buffer);
   //统计读取多少个字节数
   $file_count+=$buffer;
   //把部分数据返回给浏览器
   echo $file_data;
  }

  //关闭文件
  fclose($fp);
 }

 file_dowm("bjnihao.jpg","/http/dowm/");
?>

另一个代码:

public function downloads($name){
  $name_tmp = explode("_",$name);
  $type = $name_tmp[0];
  $file_time = explode(".",$name_tmp[3]);
  $file_time = $file_time[0];
  $file_date = date("Y/md",$file_time);
  $file_dir = SITE_PATH."/data/uploads/$type/$file_date/";   if (!file_exists($file_dir.$name)){
   header("Content-type: text/html; charset=utf-8");
   echo "File not found!";
   exit; 
  } else {
   $file = fopen($file_dir.$name,"r"); 
   Header("Content-type: application/octet-stream");
   Header("Accept-Ranges: bytes");
   Header("Accept-Length: ".filesize($file_dir . $name));
   Header("Content-Disposition: attachment; filename=".$name);
   echo fread($file, filesize($file_dir.$name));
   fclose($file);
  }
 }

 

PHP 相关文章推荐
一个php作的文本留言本的例子(四)
Oct 09 PHP
PHP新手上路(二)
Oct 09 PHP
php+mysql分页代码详解
Mar 27 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
Dec 25 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
在Win7 中为php扩展配置Xcache
Oct 08 PHP
PHP中foreach()用法汇总
Jul 02 PHP
总结对比php中的多种序列化
Aug 28 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
php按百分比生成缩略图的代码分享
May 10 #PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 #PHP
php下获取http状态的实现代码
May 09 #PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 #PHP
简单的php新闻发布系统教程
May 09 #PHP
php下载文件源代码(强制任意文件格式下载)
May 09 #PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 #PHP
You might like
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
aspx中利用js实现确认删除代码
2010/07/22 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
Python对象与引用的介绍
2019/01/24 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
科研先进个人典型材料
2014/01/31 职场文书
高中生物教学反思
2014/02/05 职场文书
工作岗位说明书模板
2014/05/09 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
务虚会发言材料
2014/12/25 职场文书
士兵突击观后感
2015/06/16 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
python爬虫selenium模块详解
2021/03/30 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js