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 相关文章推荐
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
php时间函数用法分析
May 28 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
设定php简写功能的方法
Nov 28 PHP
PHP中SESSION过期设置
Mar 09 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集成FCK的函数代码
2008/09/27 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
Vue基础配置讲解
2019/11/29 Javascript
浅谈python写入大量文件的问题
2018/11/09 Python
python实现接口并发测试脚本
2019/06/25 Python
python开启debug模式的方法
2019/06/27 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
应届生煤化工求职信
2013/10/21 职场文书
四风存在的原因分析
2014/02/11 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
三八节祝酒词
2015/08/11 职场文书
2016国培研修心得体会
2016/01/08 职场文书
小学思想品德教学反思
2016/02/24 职场文书