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 相关文章推荐
我的论坛源代码(十)
Oct 09 PHP
整合了前面的PHP数据库连接类~~做成一个分页类!
Nov 25 PHP
PHP数组及条件,循环语句学习
Nov 11 PHP
PHP编程函数安全篇
Jan 08 PHP
php日历制作代码分享
Jan 20 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
如何用PHP websocket实现网页实时聊天
May 26 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 类型转换函数intval
2009/06/20 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
python多线程socket编程之多客户端接入
2017/09/12 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Python玩转Excel的读写改实例
2019/02/22 Python
详解python和matlab的优势与区别
2019/06/28 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
小小商店教学反思
2014/04/27 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
创业计划之特色精品店
2019/08/12 职场文书
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers