完善的文件下载方法

php php 文件操作 744      收藏
完善的文件下载方法

PHP封装的一个完善的下载方法,包括本地文件及网络文件的下载,本地文件支持分流。    
    /**
    * 阿炳个性下载方法 (欢迎指出BUG或交流更完美的方法)
    * Developer: Mr.Li , QQ:1691285988 2018.08.08
    * @param url 网络文件URL 本站或远程、云端文件等。
    * @return 输出文件流
    */
    public function download($file_path,$file_tmp_name='') {
        
        $suffix = pathinfo($file_path,PATHINFO_EXTENSION);
        $suffix = $suffix ?'.'.$suffix:strrchr($file_path,'.');
        if(!$file_tmp_name)
        {// 个性文件名
            $file_tmp_name = 'ABingFileDownload_'.date('Ymd');
        }
        $file_tmp_name .= $suffix;

        if(preg_match("/[\x7f-\xff]/",$file_path))
        {// 避免中文检测不到,进行转码utf-8->gbk
            $file_path = iconv('utf-8', 'gb2312',$file_path);
        }

        if($file_path && file_exists($file_path))
        {// 本地文件下载 支持分流
            //文件大小
            $file_size = filesize ($file_path);
            //打开文件    
            $file_content = fopen ($file_path, "r" );
            //返回的文件(流形式)
            Header ( "Content-type: application/octet-stream" );
            //按照字节大小返回
            Header ( "Accept-Ranges: bytes" );
            //返回文件大小
            Header ( "Accept-Length: " . $file_size );
            //客户端弹出对话框,对应的文件名
            Header ( "Content-Disposition: attachment; filename=".$file_tmp_name);

            //输出文件内容进行下载
            if( $file_size>1048576 )
            {
                // 缓存区处理
                ob_clean();
                flush();

                //设置分流字节
                $buffer = 1048576; // 1024 * 1024
                //文件传输字节计数
                $count = 0;
                // 分流计算
                while( !feof($file_content) && ($file_size-$count > 0) )
                {
                    $count += $buffer;//增加计数
                    // 传输数据到浏览器端
                    echo fread( $file_content, $buffer );
                }
            }
            else
            {
                //传输数据到浏览器端
                echo fread ( $file_content, $file_size );
            }
            fclose ( $file_content );
            exit();
        }
        else
        if($file_path && @file_get_contents($file_path, null, null, -1, 1)!==false)
        {// 网络文件下载
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.$file_tmp_name);
            header('Content-Transfer-Encoding: binary');
            readfile($file_path);
            exit();
        }
        else
        {// 不支持的下载
            header("HTTP/1.1 404 Not Found");
            exit('G D Z ~ ~ ~');
        }
    }