免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2262 | 回复: 7
打印 上一主题 下一主题

一个定制download函数,有个地方不明白,求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-21 10:25 |只看该作者 |倒序浏览
请问下面代码中红色部分的$cur_pos变量起什么作用?
为何非得要这个$cur_pos变量呢?


//----------------------------
//名称:文件下载类
//作用:隐藏下载地址函数
//用法:download($file_dir,$file_name)
//----------------------------
function download($file_dir,$file_name)
//参数说明:
//file_dir:文件所在目录
//file_name:文件名
{
    $file_dir = chop($file_dir);//去掉路径中多余的空格
    //得出要下载的文件的路径
    if($file_dir != "")
    {
        $file_path = $file_dir;
        if(substr($file_dir,strlen($file_dir)-1,strlen($file_dir)) != "/");
            $file_path .= "/";
        $file_path .= $file_name;
    }            
    else
        $file_path = $file_name;   
   
    //判断要下载的文件是否存在
    if(!file_exists($file_path))
    {
        echo $file_path;
                echo "对不起,你要下载的文件不存在。";
        return false;
    }

    $file_size = filesize($file_path);

    header("Content-type: application/octet-stream");
    header("Accept-Ranges: bytes");
    header("Accept-Length: $file_size");
    header("Content-Disposition: attachment; filename=".$file_name);
   
    $fp = fopen($file_path,"r");
    $buffer_size = 1024;
    $cur_pos = 0;
   
    while(!feof($fp)&&$file_size-$cur_pos>$buffer_size)
    {
        $buffer = fread($fp,$buffer_size);
        echo $buffer;
        $cur_pos += $buffer_size;
    }

   
    $buffer = fread($fp,$file_size-$cur_pos);
    echo $buffer;
    fclose($fp);
    return true;

}

论坛徽章:
0
2 [报告]
发表于 2007-08-21 11:54 |只看该作者
current position, 当前已经读取的字节数, 也是下一个要开始读取的字节的位置.

论坛徽章:
0
3 [报告]
发表于 2007-08-21 13:22 |只看该作者
谢谢楼上的解答
再问一下,每次读出来的这$buffer_size个字节的数据存在哪里呢了?
服务器上?还是客户端?

这个存储位置有无大小限制呢?

论坛徽章:
0
4 [报告]
发表于 2007-08-21 13:48 |只看该作者
存在$buffer变量里啊,php是在服务器端运行的,自然存在服务器端。

php中单个的变量好像是没有大小限制的,但php.ini中memory_limit规定了最大的内存使用量,只要不超过这个值就没事了,嫌小的话可以改。

论坛徽章:
0
5 [报告]
发表于 2007-08-21 14:23 |只看该作者
那再问个比较弱智的问题,如果我的memory_limit规定内存最大使用量是8M,
而我目标要下载的文件大于8M,例如20M,是不是这个函数就基本上都会失败呢?

论坛徽章:
0
6 [报告]
发表于 2007-08-21 14:51 |只看该作者
不会的,这段代码每次只读$buffer_size个字节的数据,然后就向浏览器发送,如此循环,直到发送完。

基础不行啊,建议好好看书再来提问。

论坛徽章:
0
7 [报告]
发表于 2007-08-21 18:20 |只看该作者
谢谢楼上的回答

确实基础不行,不过确实看书了,但是php书貌似没有设计这么细节问题的,网上找资料也没有发现类似资料

手册也看了

楼上说的基础不是指看php书吧?能告知应该看什么书呢?C语言?

[ 本帖最后由 goldview 于 2007-8-21 18:42 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-08-21 19:04 |只看该作者
熟悉一门语言就可以了,然后再举一反三。至少得读得懂程序吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP