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

WBOY
Libérer: 2016-06-06 20:27:40
original
2869 Les gens l'ont consulté

下载代码

<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>
Copier après la connexion
Copier après la connexion

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

回复内容:

下载代码

<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>
Copier après la connexion
Copier après la connexion

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

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!