下载大文件在360显示未知大小,火狐又可以显示的

WBOY
풀어 주다: 2016-06-06 20:27:40
원래의
2869명이 탐색했습니다.

下载代码

<code class="php">function downFile($filePath, $filesize) {
    // 设置文件最长执行时间和内存
    set_time_limit ( 0 );
    ini_set ( 'memory_limit', '1024M' );
    // 检测文件是否存在
    if (! is_file ( $filePath )) {
        die ( "<b>404 File not found!</b>" );
    }
    $filename = basename ( $filePath ); // 获取文件名字
    $size = $filesize;
    // 开始写输出头信息
    header ( "Cache-Control: public" );
    // 设置输出浏览器格式
    header ( "Content-Type: application/octet-stream" );
    header ( "Content-Disposition: attachment; filename=" . $filename );
    header ( "Content-Transfer-Encoding: binary" );
    header ( "Accept-Ranges: bytes" );
    $range = 0;
    // 如果有$_SERVER['HTTP_RANGE']参数
    if (isset ( $_SERVER ['HTTP_RANGE'] )) {
        /*
         * Range头域   Range头域可以请求实体的一个或者多个子范围。 例如, 表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后500个字节:bytes=-500 表示500字节以后的范围:bytes=500- 第一个和最后一个字节:bytes=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK).
         */
        // 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912-
        list ( $a, $range ) = explode ( "=", $_SERVER ['HTTP_RANGE'] );
        // if yes, download missing part
        $size2 = $size - 1; // 文件总字节数
        $new_length = $size2 - $range; // 获取下次下载的长度
        header ( "HTTP/1.1 206 Partial Content" );
        header ( "Content-Length: {$new_length}" ); // 输入总长
        header ( "Content-Range: bytes {$range}-{$size2}/{$size}" ); // Content-Range: bytes 4908618-4988927/4988928 95%的时候
    } else {
        // 第一次连接
        $size2 = $size - 1;
        header ( "Content-Range: bytes 0-{$size2}/{$size}" ); // Content-Range: bytes 0-4988927/4988928
        header ( "Content-Length: " . $size ); // 输出总长
    }
    // 打开文件
    $fp = fopen ( "{$filePath}", "rb" );
    // 设置指针位置
    fseek ( $fp, $range );
    // 虚幻输出
    while ( ! feof ( $fp ) ) {
        print (fread ( $fp, 1024 * 8 )) ; // 输出文件
        flush (); // 输出缓冲
        ob_flush ();
    }
    fclose ( $fp );
    exit ();
}</code>
로그인 후 복사
로그인 후 복사

虽然成功下载了大文件,这个没解决感觉不完美,求帮助
代码缩进好了

回复内容:

下载代码

<code class="php">function downFile($filePath, $filesize) {
    // 设置文件最长执行时间和内存
    set_time_limit ( 0 );
    ini_set ( 'memory_limit', '1024M' );
    // 检测文件是否存在
    if (! is_file ( $filePath )) {
        die ( "<b>404 File not found!</b>" );
    }
    $filename = basename ( $filePath ); // 获取文件名字
    $size = $filesize;
    // 开始写输出头信息
    header ( "Cache-Control: public" );
    // 设置输出浏览器格式
    header ( "Content-Type: application/octet-stream" );
    header ( "Content-Disposition: attachment; filename=" . $filename );
    header ( "Content-Transfer-Encoding: binary" );
    header ( "Accept-Ranges: bytes" );
    $range = 0;
    // 如果有$_SERVER['HTTP_RANGE']参数
    if (isset ( $_SERVER ['HTTP_RANGE'] )) {
        /*
         * Range头域   Range头域可以请求实体的一个或者多个子范围。 例如, 表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后500个字节:bytes=-500 表示500字节以后的范围:bytes=500- 第一个和最后一个字节:bytes=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK).
         */
        // 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912-
        list ( $a, $range ) = explode ( "=", $_SERVER ['HTTP_RANGE'] );
        // if yes, download missing part
        $size2 = $size - 1; // 文件总字节数
        $new_length = $size2 - $range; // 获取下次下载的长度
        header ( "HTTP/1.1 206 Partial Content" );
        header ( "Content-Length: {$new_length}" ); // 输入总长
        header ( "Content-Range: bytes {$range}-{$size2}/{$size}" ); // Content-Range: bytes 4908618-4988927/4988928 95%的时候
    } else {
        // 第一次连接
        $size2 = $size - 1;
        header ( "Content-Range: bytes 0-{$size2}/{$size}" ); // Content-Range: bytes 0-4988927/4988928
        header ( "Content-Length: " . $size ); // 输出总长
    }
    // 打开文件
    $fp = fopen ( "{$filePath}", "rb" );
    // 设置指针位置
    fseek ( $fp, $range );
    // 虚幻输出
    while ( ! feof ( $fp ) ) {
        print (fread ( $fp, 1024 * 8 )) ; // 输出文件
        flush (); // 输出缓冲
        ob_flush ();
    }
    fclose ( $fp );
    exit ();
}</code>
로그인 후 복사
로그인 후 복사

虽然成功下载了大文件,这个没解决感觉不完美,求帮助
代码缩进好了

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!