简体   繁体   中英

How to download large file from a link by php?

I am trying to download a large file from an external link using php, I don't have a big idea about this subject, I tried to use the code below, but it always giving me file does not exist! .

I changed the if(file_exists($filePath)) to if(true) , but I end with a downloaded file of 0 byte size, where is the error in my code?

$filePath = "http://down.egyu.net/Movies/The.Gambler.2014.720p.BluRay.x264.EGFire.CoM.mp4"; // set your download file path here.
download($filePath); // calls download function
function download($filePath)
{    
    if(!empty($filePath))
    {
        $fileInfo = pathinfo($filePath);
        $fileName  = $fileInfo['basename'];
        $fileExtnesion   = $fileInfo['extension'];
        $default_contentType = "application/octet-stream";
        $content_types_list = mimeTypes();
        // to find and use specific content type, check out this IANA page : http://www.iana.org/assignments/media-types/media-types.xhtml
        if (array_key_exists($fileExtnesion, $content_types_list)) 
        {
            $contentType = $content_types_list[$fileExtnesion];
        }
        else
        {
            $contentType =  $default_contentType;
        }
        if(file_exists($filePath))
        {
            $size = filesize($filePath);
            $offset = 0;
            $length = $size;
            //HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
            if(isset($_SERVER['HTTP_RANGE']))
            {
                preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
                $offset = intval($matches[1]);
                $length = intval($matches[2]) - $offset;
                $fhandle = fopen($filePath, 'r');
                fseek($fhandle, $offset); // seek to the requested offset, this is 0 if it's not a partial content request
                $data = fread($fhandle, $length);
                fclose($fhandle);
                header('HTTP/1.1 206 Partial Content');
                header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $size);
            }//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
            //USUAL HEADERS FOR DOWNLOAD
            header("Content-Disposition: attachment;filename=".$fileName);
            header('Content-Type: '.$contentType);
            header("Accept-Ranges: bytes");
            header("Pragma: public");
            header("Expires: -1");
            header("Cache-Control: no-cache");
            header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0");
            header("Content-Length: ".filesize($filePath));
            $chunksize = 8 * (1024 * 1024); //8MB (highest possible fread length)
            if ($size > $chunksize)
            {
              $handle = fopen($_FILES["file"]["tmp_name"], 'rb');
              $buffer = '';
              while (!feof($handle) && (connection_status() === CONNECTION_NORMAL)) 
              {
                $buffer = fread($handle, $chunksize);
                print $buffer;
                ob_flush();
                flush();
              }
              if(connection_status() !== CONNECTION_NORMAL)
              {
                echo "Connection aborted";
              }
              fclose($handle);
            }
            else 
            {
              ob_clean();
              flush();
              readfile($filePath);
            }
         }
         else
         {
           echo 'File does not exist!';
         }
    }
    else
    {
        echo 'There is no file to download!';
    }
}

I found the answer myself, I used a function to get the status of url if it exist and to get the file size:

/* You may need these ini settings too */
set_time_limit(0);
ini_set('memory_limit', '512M');



//THE DOWNLOAD SCRIPT
$filePath = "http://down.egyu.net/Movies/The.Gambler.2014.720p.BluRay.x264.EGFire.CoM.mp4"; // set your download file path here.

download($filePath); // calls download function
function download($filePath)
{    
    if(!empty($filePath))
    {
        $fileInfo = pathinfo($filePath);
        $fileName  = $fileInfo['basename'];
        $fileExtnesion   = $fileInfo['extension'];
        $default_contentType = "application/octet-stream";
        $content_types_list = mimeTypes();
        // to find and use specific content type, check out this IANA page : http://www.iana.org/assignments/media-types/media-types.xhtml
        if (array_key_exists($fileExtnesion, $content_types_list)) 
        {
            $contentType = $content_types_list[$fileExtnesion];
        }
        else
        {
            $contentType =  $default_contentType;
        }

        $exist = is_url_exist($fileInfo['dirname']."/".$fileInfo['basename']);

        if($exist['response'])
        {
            $size = $exist['size'];
            $offset = 0;
            $length = $size;
            //HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
            if(isset($_SERVER['HTTP_RANGE']))
            {
                preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
                $offset = intval($matches[1]);
                $length = intval($matches[2]) - $offset;
                $fhandle = fopen($filePath, 'r');
                fseek($fhandle, $offset); // seek to the requested offset, this is 0 if it's not a partial content request
                $data = fread($fhandle, $length);
                fclose($fhandle);
                header('HTTP/1.1 206 Partial Content');
                header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $size);
            }//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
            //USUAL HEADERS FOR DOWNLOAD
            header("Content-Disposition: attachment;filename=".$fileName);
            header('Content-Type: '.$contentType);
            header("Accept-Ranges: bytes");
            header("Pragma: public");
            header("Expires: -1");
            header("Cache-Control: no-cache");
            header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0");
            header("Content-Length: ".$size);
            $chunksize = 8 * (1024 * 1024); //8MB (highest possible fread length)
            if ($size > $chunksize)
            {
              $handle = fopen($_FILES["file"]["tmp_name"], 'rb');
              $buffer = '';
              while (!feof($handle) && (connection_status() === CONNECTION_NORMAL)) 
              {
                $buffer = fread($handle, $chunksize);
                print $buffer;
                ob_flush();
                flush();
              }
              if(connection_status() !== CONNECTION_NORMAL)
              {
                echo "Connection aborted";
              }
              fclose($handle);
            }
            else 
            {
              ob_clean();
              flush();
              readfile($filePath);
            }
         }
         else
         {
           echo 'File does not exist!';
         }
    }
    else
    {
        echo 'There is no file to download!';
    }
}

function is_url_exist($url){

    $array = array();

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

    if($code == 200){
       $array['response'] = true;
    }else{
      $array['response'] = false;
    }

    $array['size'] = $size;

    curl_close($ch);

   return $array;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM