当前位置:Gxlcms > PHP教程 > 下载大文件在360显示未知大小,火狐又可以显示的

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

时间:2021-07-01 10:21:17 帮助过:11人阅读

下载代码

function downFile($filePath, $filesize) {
    // 设置文件最长执行时间和内存
    set_time_limit ( 0 );
    ini_set ( 'memory_limit', '1024M' );
    // 检测文件是否存在
    if (! is_file ( $filePath )) {
        die ( "404 File not found!" );
    }
    $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 (); }

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

回复内容:

下载代码

function downFile($filePath, $filesize) {
    // 设置文件最长执行时间和内存
    set_time_limit ( 0 );
    ini_set ( 'memory_limit', '1024M' );
    // 检测文件是否存在
    if (! is_file ( $filePath )) {
        die ( "404 File not found!" );
    }
    $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 (); }

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

人气教程排行