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 相关文章推荐
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
php实现的短网址算法分享
Jun 20 PHP
php字符串函数学习之substr()
Mar 27 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
thinkPHP分页功能实例详解
May 05 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
Yii2单元测试用法示例
2016/11/12 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python实现C4.5决策树算法
2018/08/29 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
Exception类的常用方法
2012/06/16 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
最新计算机专业自荐信
2013/10/16 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL