• 技术文章 >后端开发 >php教程

    上载有关问题,小文件上载正常,上载大于100M的文件,进度条到100M以外的时候,进度条就不走了,代码什么地方出有关问题了

    2016-06-13 11:05:49原创355
    下载问题,小文件下载正常,下载大于100M的文件,进度条到100M以外的时候,进度条就不走了,代码什么地方出问题了?
    本帖最后由 bxline 于 2012-12-17 06:31:43 编辑

    我用的是下面的代码,我试验了两回一次下载到145M不走了,一次下载到129M就不走了
    ,这是怎么回事?小文件下载正常,就是大于100M的文件不正常
    下面是代码:我是03+FASTCGI,不是apache,所以代码中有的行给注释掉了

    if(file_exists($filename)){
    $mtime = ($mtime = filemtime($filename)) ? $mtime : gmtime();
    $size = intval(sprintf("%u", filesize($filename)));
    #if (intval($size + 1) > return_bytes(ini_get('memory_limit')) && intval($size * 1.5) <= 1073741824) {
    # ini_set('memory_limit', intval($size * 1.5));
    #}
    [email protected]_setenv('no-gzip', 1);
    [email protected]_set('zlib.output_compression', 0);
    header('Content-Description: File Transfer');
    header('Content-Type: application/force-download');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($filename));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header("Content-Length: " . $size);
    set_time_limit(300);
    $chunksize = 1 * (1024 * 1024);
    // ob_clean();
    // flush();
    if ($size > $chunksize) {
    $handle = fopen($filename, 'rb');
    $buffer = '';
    while (!feof($handle)) {
    $buffer = fread($handle, $chunksize);
    echo $buffer;
    ob_flush();
    flush();
    }
    fclose($handle);
    } else {
    ob_flush();
    flush();
    readfile($filename);
    }
    exit;
    }
    ------解决方案--------------------
    echo 100 * 1024 / 300;
    得 341 K/s
    即需要平均带宽为 3M 以上

    你的下载代码不具有断点续传能力,一旦出现传输错误,即可终止
    ------解决方案--------------------
    我该写了一下,你看看

    Function down($file){
    IF(!$file Or !File_Exists($file) Or !Is_Readable($file)) {Return False;}

    IF($f = atr($file)) {
    Header("Content-Length:{$f['size']}");
    Header('Content-Description:File Transfer');
    Header('Content-Transfer-Encoding:binary');
    Header('Expires:0');
    Header('Cache-Control:must-revalidate');
    Header('Pragma:public');

    IF(Function_exists("mime_content_type")) {
    Header("Content-Type: ".mime_content_type($f['name']));
    }Else{
    Header("Content-Type: application/octet-stream");
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    相关文章推荐

    • 浅析PHP中的类自动加载相关文件• 系统讲解PHP缓存技术• 一文理解和实现现代PHP框架里的IOC容器• 深入了解PHP:用gdb调试源码• 实例介绍:使用Docker快速搭建多版本PHP开发环境
    1/1

    PHP中文网