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 4.2书写安全的脚本
Oct 09 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 PHP
基于MySQL体系结构的分析
May 02 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
php远程下载类分享
Apr 13 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
基于Laravel-admin 后台的自定义页面用法详解
Sep 30 PHP
php实现映射操作实例详解
Oct 02 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
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
php-fpm添加service服务的例子
2018/04/27 PHP
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
浅析vue-router原理
2018/10/19 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
Cython 三分钟入门教程
2009/09/17 Python
python类继承用法实例分析
2014/10/10 Python
python3 线性回归验证方法
2019/07/09 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
Python中内建模块collections如何使用
2020/05/27 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python Xpath语法的使用
2020/11/26 Python
用python制作个视频下载器
2021/02/01 Python
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
高三生物教学反思
2014/01/25 职场文书
生态养殖创业计划书
2014/05/06 职场文书
家长学校工作方案
2014/05/07 职场文书
生物技术专业求职信
2014/06/10 职场文书
物流管理专业自荐信
2014/06/23 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
初中团支书竞选稿
2015/11/21 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
科普 | 业余无线电知识-波段篇
2022/02/18 无线电