PHP download script failed when download file > 1GB show net

Discuss how to use and promote Web standards with the Mozilla Gecko engine.
chandra prakash
Posts: 4
Joined: January 12th, 2017, 11:44 pm

Post Posted January 24th, 2017, 6:12 am

I am using the following code to download a file in PHP. Code works fine for most videos, but when I try to download video larger than 1 GB it failed and shows me a download error when it get to 1gb (exactly 1gb, no less, no more), this error happens with all browsers. But, if I use jdownloader or DownThemAll or any software all downloads are succesfully downloaded.

Code: Select all
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

    // 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) ;
             if($daily_downloaded_data>=(20*1024*1024*1024)){           // Check Daily  Download Data Limit 20GB Exceed or not

 // required for IE, otherwise Content-Disposition may be ignored
 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
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
    list($range) = explode(",",$range,2);
    list($range, $range_end) = explode("-", $range);
    if(!$range_end) {
    } else {

    $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 {
    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'))
    fseek($file, $range);

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

            $lastsotrage= $lastsotrage + $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.');
//Set the time out

//path to the file
$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.'');

Last edited by chandra prakash on January 25th, 2017, 12:03 am, edited 1 time in total.


User avatar
Posts: 2095
Joined: May 5th, 2004, 10:40 am
Location: Belgium

Post Posted January 24th, 2017, 11:49 am

Are you sure that wherever you're running this the ini_set commands actually do something? On shared hosting you probably won't be able to do anything about memory limits and timeouts.
Intelligent alien life does exist, otherwise they would have contacted us.

Return to Web Development / Standards Evangelism

Who is online

Users browsing this forum: No registered users and 1 guest