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

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

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

代码如下:

[php] view plaincopy

  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 ();

时间: 2024-08-01 23:15:46

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

uva 11195 Another queen (用状态压缩解决N后问题)

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2136 Problem A Another n-Queen Problem I guess the n-queen problem is known by every person who has studied backtracking. In this problem you s

美团_ccListView选中Item的颜色修改及解决登陆后升级通知再次弹出的bug

实现,在listView Xml中设置 android:listSelector="@color/green" 2. 解决登陆后升级通知再次弹出的bug ①: MineFragment跳转到Login界面使用StartActivityForResult,而不是StartActivity: @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != n

分享 WebBrowser显示Html内容3点细节技巧,解决刷新后空白

直接显示Html内容,不像直接导航网址容易处理: 问题:按微软的控件属性提示,可以用WebBrowser.DocumentText 属性赋值 ,但是这种赋值,只是首次有效,后续切换都没啥作用. 下面给出自己追求摸索的两点技巧: 1:通过WebBrowser.Document.Write(html)方法来输出html内容显示. 由于WebBrowser 需要经历几个事件后才会显示,直接输出是不行的,为此,需要有点技巧的使用: wbShowBlog.Navigate("about:blank&quo

AI -- 回溯法解决四皇后问题

AI -- 回溯法解决四皇后问题 回溯法 四皇后 C语言 问题描述 在 4*4 的棋盘上无冲突的摆放 4 个皇后,无冲突是指一个皇后所在位置的水平.竖直以及斜线上不能出现其他的皇后,其他的 n 皇后问题以此类推 解决方法 按行来摆放棋子,下一行的摆放满足于与上一行的棋子没有冲突,否则就返回上一步走其他的路线,这就是所谓的回溯法 详细说明 在第一行有四种可能,选择第一个位置放上皇后 第二行原本可以有四种可能摆放,但是第一第二个已经和第一行的皇后冲突了,因此只剩下第三第四个格子了,先选择第三个格子

回溯法解决四皇后问题

以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度斜线上都不能出现皇后的棋子,例子 要求编程求出符合要求的情况的个数.四皇后问题有很多种解法,这里主要介绍一种经典的解决方法:回溯法 回溯法的基本思想是:可以构建出一棵解空间树,通过探索这棵解空间树,可以得到四皇后问题的一种或几种解.这样的解空间树有四棵 在如上图所示的4×4的棋盘上,按列来摆放棋子,

nginx 配置https 并解决重定向后https协议变成了http的问题

配置如下: server {     listen       80;     server_name  localhost;           return 301 https://localhost$request_uri;      charset UTF-8; location / {       root   html;                  # 这个是指定一个项目所在目录       index  index.html index.htm;  # 这个是指定首页的文件名

vue项目打包部署-----解决打包后访问资源失败问题

vue项目打包部署-----解决打包后访问资源失败问题. 本文链接:https://blog.csdn.net/kaola_l/article/details/80497490 打包之前需要修改如下配置文件: 配置文件一:build>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件的问题) 配置文件二:config>>index.js(修改assetsPublicPath:'./' ,修改目的是为了解决js找

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

我最近买的书里面带的CD盘,放电脑里后,说是0字节,但是可以播放,不能把里面的东西复制出来,有track1,track2之类的文件,都只有几十字节大,请问有没有什么方法把里面的音乐复制出来??? 用widows media player打开CD后 可以很方便的吧track文件转为MP3 追问: 哦,我回去试试先...谢谢. 追答: (1)设置 复制CD前先进行设置,选择“工具”菜单中的“选项”命令,在弹出的“选项”对话框中选择“复制音乐”选项卡(图1).在“格式”下拉列表中 选择复制的格式,可选

解决文件下载在火狐浏览器出现中文文件名乱码的方法

笔者最近写了个导出Excel的工具,后面发现在火狐浏览器下载的文件的文件名是一串看不懂的字母. 后面找到了解决方法,下面直接上代码. /** 下载时文件名为中文:乱码解决 */ // 响应的过程: // 服务器: utf-8|gbk --> iso8859-1 浏览器: iso8859-1 --> utf-8|gbk (firefox.chrome) // 服务器: gbk --> iso8859-1 浏览器: iso8859-1 --> gbk (msie) fileName =