下载文件时,PHP下载脚本失败> 1GB显示网络失败错误

时间:2017-01-24 09:48:30

标签: php video download

我使用以下代码在PHP中下载文件。代码适用于大多数视频,但是当我尝试下载大于1 GB的视频时,它失败了并且当它达到1gb(正好1gb,不少,不多)时显示下载错误,所有浏览器都会出现此错误。但是,如果我使用jdownloader或DownThemAll或任何软件,所有下载都会成功下载。

<?php
set_time_limit(0); 
ini_set('memory_limit', '2G');

function getMimeType($fileName)
{
    $c_type_default = "application/octet-stream";
    $content_types = array(
        "exe" => "application/octet-stream",
        "zip" => "application/zip",
        "mp3" => "audio/mpeg",
        "mpg" => "video/mpeg",
        "avi" => "video/x-msvideo",
         "mp4" => "video/mp4",
    );
//  echo isset($content_types[pathinfo($fileName, PATHINFO_EXTENSION)]) ? $content_types[pathinfo($fileName, PATHINFO_EXTENSION)] : $c_type_default;     
    return isset($content_types[pathinfo($fileName, PATHINFO_EXTENSION)]) ? $content_types[pathinfo($fileName, PATHINFO_EXTENSION)] : $c_type_default;
}
function output_file($file, $name)
{

 /*
 This function takes a path to a file to output ($file),  the filename that the browser will see ($name) and  the MIME type of the file ($mime_type, optional).
 */

 //Check the file premission
 if(!is_readable($file)) die('File not found or inaccessible!');

 $size = filesize($file);

 $name = rawurldecode($name);

 //turn off output buffering to decrease cpu usage
     @ob_end_clean(); 
    include('../includes/configg.php');

    // Start Code  For Total Downloaded Data Size by The LoggedIn User
        $user="select * from $TBusers where id=".$_SESSION['log_id'];
        $result_user = mysqli_query($conn, $user) ;
        $row = mysqli_fetch_assoc($result_user);
        $lastsotrage = $row['down'];  
        $curr_date= $row['curr_date'];
        $today_date= date('d-m-y');
        $daily_downloaded_data= $row['daily_downloaded_data'];
        if($curr_date != $today_date)
        { 
              $update_curr_date="update $TBusers set curr_date ='$today_date', daily_downloaded_data =0 where id=".$_SESSION['log_id'];  // Set Curr_date by Today Date For check Daily Downloaded Data Limit

              mysqli_query($conn,$update_curr_date) ;
              $daily_downloaded_data=0;
        }
        /*else
        {
             if($daily_downloaded_data>=(20*1024*1024*1024)){           // Check Daily  Download Data Limit 20GB Exceed or not
             header('Location: http://idownload.club/members/download.php');
             exit;}
        }*/


 // required for IE, otherwise Content-Disposition may be ignored
 if(ini_get('zlib.output_compression'))
 ini_set('zlib.output_compression', 'Off');

 header('Content-Type: ' . getMimeType($name));
 header('Content-Disposition: attachment; filename="'.$name.'"');
 header("Content-Transfer-Encoding: binary");
 header('Accept-Ranges: bytes');

 /* The three lines below basically make the 
    download non-cacheable */
 header("Cache-control: private");
 header('Pragma: private');
 header("Expires: 0");


 // multipart-download and download resuming support
 if(isset($_SERVER['HTTP_RANGE']))
 {    
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
    list($range) = explode(",",$range,2);
    list($range, $range_end) = explode("-", $range);
    $range=intval($range);
    if(!$range_end) {
        $range_end=$size-1;
    } else {
        $range_end=intval($range_end);
    }

    $new_length = $range_end-$range+1;
    header("HTTP/1.1 206 Partial Content");
    header("Content-Length: $new_length");
    header("Content-Range: bytes $range-$range_end/$size");
 } else {
    $new_length=$size;
    header("Content-Length: ".$size);
 }

 /* Will output the file itself */
 $chunksize = 8*(1024*1024); //you may want to change this
 $bytes_send = 0;
 if ($file = fopen($file, 'r'))
 {
    if(isset($_SERVER['HTTP_RANGE']))
    fseek($file, $range);

    while(!feof($file) && 
        (!connection_aborted()) && 
        ($bytes_send<$new_length)
          )
    {
        $buffer = fread($file, $chunksize);
        print($buffer); //echo($buffer); // can also possible
        //flush();
        $bytes_send += strlen($buffer);
    }
 fclose($file);

            $lastsotrage= $lastsotrage + $size;
            $daily_downloaded_data+=$size;
            $sql="update $TBusers set down =". $lastsotrage." where id=".$_SESSION['log_id'];
            $sql2="update $TBusers set daily_downloaded_data = $daily_downloaded_data where id=".$_SESSION['log_id'];
            $sql3= "update test set count=count+1 where id=1" ;
            mysqli_query($conn,$sql) ;
            mysqli_query($conn,$sql2) ;mysqli_query($conn,$sql3) ;
            file_put_contents('data.txt', print_r($_SERVER, true), FILE_APPEND);


 } else
 //If no permissiion
 die('Error - can not open file.');
 //die
die();
}
//Set the time out
set_time_limit(0);



//path to the file
$file_dir=$_GET['directory'];
$file_name = str_replace("/", "", $_GET['file']);
$file_name = str_replace("\\", "", $file_name);
$file = $file_dir . "/".$file_name; 


//Call the download function with file path,file name and file type
output_file($file, ''.$file_name.'');


?>

0 个答案:

没有答案