php文件下载比较常见,网上的资料比较多,在此不再强调怎么去实现(因为也是网上看的)。下面主要说明的是下载代码的注意点。

php下载文件主要是把文件以字节流直接输出,也就是echo fread($file, filesize($file_name));,这里要注意的是如果你在代码之前(或之后)有输出,也可能被写入下载的文件中,解决的方法是使用 ob_start();和ob_end_clean();来清除前面的输出,后面的输出直接使用@fclose($file);exit(0);来解决。

代码如下:

  1. ob_start();
  2. $file_name = iconv("utf-8","gb2312",$file_name);
  3. if (!is_file($file_name)){
  4. echo "url error!";
  5. } else {
  6. $ua = $_SERVER["HTTP_USER_AGENT"];
  7. if (preg_match("/MSIE/", $ua)) {
  8. $encoded_filename = urlencode(basename($file_name));
  9. $encoded_filename = str_replace("+", "%20", $encoded_filename);
  10. $con_dis = 'Content-Disposition: attachment; filename="' . $encoded_filename . '"';
  11. } else if (preg_match("/Firefox/", $ua)) {
  12. $con_dis = 'Content-Disposition: attachment; filename*="utf8\'\'' . basename($file_name) . '"';
  13. } else {
  14. $con_dis = 'Content-Disposition: attachment; filename="' . basename($file_name) . '"';
  15. }
  16. $file = fopen($file_name, "r");
  17. //输入文件标签
  18. ob_end_clean();Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length: ".filesize($file_name));Header($con_dis);
  19. //输出文件内容
  20. //读取文件内容并直接输出到浏览器
  21. echo fread($file, filesize($file_name));@fclose($file);
  22. exit(0);
  23. }
PHP code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
     class FileDown {
           public $fileName;
           public $fileSize;
               //转码 gb2312         
                  function __construct($fileName){
                      $this->fileName=iconv("utf-8","gb2312",$fileName);
                  }
           function Down (){
               //$_SERVER['DOCUMENT_ROOT']当前运行脚本所在的文档根目录。在服务器配置文件中定义。
              $path=$_SERVER['DOCUMENT_ROOT']."/12/".$this->fileName;
              if(!file_exists($path)){
                  die("文件不存在");
                  }          
                $fp=fopen($path,"r");   //读入
            $this->fileSize=filesize($path); 
                  //返回文件的头 浏览器靠头识别下载  //返回
                  //返回的文件类型 流 可以是文本 二进制
                      header("Content-type: application/octet-stream");
                      //按照字节大小返回
                      header("Accept-Ranges: bytes");
                      //返回文件大小
                      header("Accept-Length: $this->fileSize");
                      //这里客户端的弹出对话框,对应的文件名
                      header("Content-Disposition: attachment; filename=".$this->fileName);                     
                    $count=0;
                   $buffer=1024;
                   while(!feof($fp)&& $this->fileSize-$count>0){
                               $fileData=fread($fp,$buffer);
                               $count+=$buffer;
                               echo $fileData;
                       }   
                  fclose($fp);
            }
               }      
    $fd=new FileDown("白羊座.png");
     $fd->Down ();

php文件下载(解决文件下载后多几个字节的问题) 与封装成类的例子的更多相关文章

  1. android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加

    以下代码实现的效果是: BoundOpenView从居中移动到顶部,移动完后,BoundSendView从隐藏变为显示,并从顶部移动BoundOpenView下方20dp处,同时透明度慢慢增加. pr ...

  2. 转载: Centos7 升级python3,解决升级后不兼容问题

    Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...

  3. linux中如何解决克隆后的电脑的问题

    1.如何解决克隆后的电脑的网络问题 克隆出来的电脑,IP地址,网卡都是重复的,不能直接使用,需要修改 1)vim  /etc/udev/rules.d/70-persistent-net.rules ...

  4. redis设置密码,解决重启后密码丢失及自启服务配置

    一.安装redis redis3.0及redisManage管理工具 链接:https://pan.baidu.com/s/1p5EWeF2Jgsw9xOE1ADMmRg 提取码:thyf 二.red ...

  5. 解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题

    解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题 错误提示信息 There might be a problem with t ...

  6. 我最近买的书里面带的CD盘,放电脑里后,说是0字节,但是可以播放,不能把里面的东西复制出来

    我最近买的书里面带的CD盘,放电脑里后,说是0字节,但是可以播放,不能把里面的东西复制出来,有track1,track2之类的文件,都只有几十字节大,请问有没有什么方法把里面的音乐复制出来??? 用w ...

  7. 为Windows Azure Web站点添加MIME类型解决文件下载失败的问题

    这几天在倒腾Autodesk 360 Viewer,前面的文章也介绍过了,这将是一个全新的在线模型浏览工具.我做了个实验,把A360Viewer放在一个web 站点,然后发布到Windows Azur ...

  8. winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难

    // winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...

  9. 安装VMWare tools,以及解决安装后/mnt中有hgfs但没共享文件的方法

    一.首先是安装VMWare tools   安装过程可参考:Installing VMware Tools in an Ubuntu virtual machine   安装成功后,可看的如下信息: ...

随机推荐

  1. Python range

    i = 1 while i <= 100: print(i) i += 1 # range(参数) [0,参数) 取不到 for i in range(10): # range() 可以被迭代 ...

  2. 第三篇 makefile的伪目标

    我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下:    1.make将makefile的目标认为是一个文件:    2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...

  3. DelaunayTriangulation_VoronoiDiagram_using_OpenCV的实现

    前言 最近project中有关于delaunay的实现问题,查找资料,看到learnopencv这个网站,有很多peoject的实现,本文主要是实现Delaunay Triangulation and ...

  4. HBulider打包

    1. manifest配置 按照Manifest.json文档说明 manifest配置把工程中的manifest.json文件配置好,下面以我的项目为例进行配置. (1).应用信息 (2).图标配置 ...

  5. BZOJ4481: [Jsoi2015]非诚勿扰【概率期望+树状数组】

    Description [故事背景] JYY赶上了互联网创业的大潮,为非常勿扰开发了最新的手机App实现单身 大龄青年之间的"速配".然而随着用户数量的增长,JYY发现现有速配的算 ...

  6. PAT 团体程序设计天梯赛 L1-046 整除光棍(模拟除法)

    L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的"光棍",并不是指单身汪 ...

  7. The Alphabet Sticker

    题目大意:给你一串字符串,其中有一部分未知,用'?'表示. 现在定义一种合法的Sticker,比如"aabcc","ccccab".即所有相同的字母要在一起才是 ...

  8. 1920*1080分辨率和1080p,1080i的关系

    1080i和1080p是由美国电影电视工程师协会确定的高清标准格式,其中1080p被称为目前数字电视的顶级显示格式,这种格式的电视在逐行扫描下能够达到1920×1080的分辨率.受限制于存储介质(一部 ...

  9. Linux下的Nginx、php、mysql、apache部署

    待补充,先搞几个博客链接: https://www.cnblogs.com/Candies/p/8282934.html http://sujianjob.com/2017/12/18/yum%E5% ...

  10. 使用python把html网页转成pdf文件

    我们看到一些比较写的比较好文章或者博客的时候,想保存下来到本地当一个pdf文件,当做自己的知识储备,以后即使这个博客或者文章的连接不存在了,或者被删掉,咱们自己也还有. 当然咱们作为一个coder,这 ...