Curl get the deleted file and load force at the same time

I am trying to get a remote file and force download it to the user at the same time. I can’t insert the code, the code is too long. but the curl function works, but the problem is that it does not return anything until it receives the deleted file and then forcibly download it to the user.

I use this to tell curl to return a callback

curl_setopt($ch, CURLOPT_READFUNCTION, 'readCallback'); 

now in my readCallback function i am doing this:

 function readCallback($curl, $stream, $maxRead){ $read = fgets($stream, $maxRead); echo $read; return $read; } 

but it does not return anything that just waits until the deleted file is retrieved.

+6
source share
2 answers

Try this, it will use curl to get the total file size, and then download partial file fragments proximating it to the user, since there is no waiting for a hang to load it firstly, I tested it with avi, mp4, mp3 and exe, hope this helps:

 <?php $file = 'http://example.com/somefile.mp3'; download($file,2000); /* Set Headers Get total size of file Then loop through the total size incrementing a chunck size */ function download($file,$chunks){ set_time_limit(0); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename='.basename($file)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Expires: 0'); header('Pragma: public'); $size = get_size($file); header('Content-Length: '.$size); $i = 0; while($i<=$size){ //Output the chunk get_chunk($file,(($i==0)?$i:$i+1),((($i+$chunks)>$size)?$size:$i+$chunks)); $i = ($i+$chunks); } } //Callback function for CURLOPT_WRITEFUNCTION, This is what prints the chunk function chunk($ch, $str) { print($str); return strlen($str); } //Function to get a range of bytes from the remote file function get_chunk($file,$start,$end){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $file); curl_setopt($ch, CURLOPT_RANGE, $start.'-'.$end); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'chunk'); $result = curl_exec($ch); curl_close($ch); } //Get total size of file function get_size($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); return intval($size); } ?> 
+6
source

Try using curl, for example:

 $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $result = curl_exec($ch); $msg = new HttpMessage($result); return $msg->getBody(); 

The return value is the contents of the requested file, which you can print. Therefore, there is no need for a callback. HTTPMessage docs .

+2
source

Source: https://habr.com/ru/post/917848/


All Articles