php – curl获取远程文件并同时强制下载

前端之家收集整理的这篇文章主要介绍了php – curl获取远程文件并同时强制下载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试获取远程文件并强制同时将其下载到用户.
我无法粘贴代码,代码太长.但curl函数有效,但问题是它没有输出任何东西,直到它首先获取远程文件然后它强制下载到用户.

我用它来告诉curl返回一个回调

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

现在在我的readCallback函数中我这样做:

  1. function readCallback($curl,$stream,$maxRead){
  2. $read = fgets($stream,$maxRead);
  3. echo $read;
  4. return $read;
  5. }

但它不会返回任何它等待直到获取远程文件完成.

试试这个,它将使用curl来获取文件的总大小然后下载代理它的文件的部分块给用户,这样就没有等待curl首先下载它,我用avi,mp4,mp3测试了这个和一个exe,希望它有所帮助:
  1. <?PHP
  2. $file = 'http://example.com/somefile.mp3';
  3. download($file,2000);
  4.  
  5. /*
  6. Set Headers
  7. Get total size of file
  8. Then loop through the total size incrementing a chunck size
  9. */
  10. function download($file,$chunks){
  11. set_time_limit(0);
  12. header('Content-Description: File Transfer');
  13. header('Content-Type: application/octet-stream');
  14. header('Content-disposition: attachment; filename='.basename($file));
  15. header('Cache-Control: must-revalidate,post-check=0,pre-check=0');
  16. header('Expires: 0');
  17. header('Pragma: public');
  18. $size = get_size($file);
  19. header('Content-Length: '.$size);
  20.  
  21. $i = 0;
  22. while($i<=$size){
  23. //Output the chunk
  24. get_chunk($file,(($i==0)?$i:$i+1),((($i+$chunks)>$size)?$size:$i+$chunks));
  25. $i = ($i+$chunks);
  26. }
  27.  
  28. }
  29.  
  30. //Callback function for CURLOPT_WRITEFUNCTION,This is what prints the chunk
  31. function chunk($ch,$str) {
  32. print($str);
  33. return strlen($str);
  34. }
  35.  
  36. //Function to get a range of bytes from the remote file
  37. function get_chunk($file,$start,$end){
  38. $ch = curl_init();
  39. curl_setopt($ch,CURLOPT_URL,$file);
  40. curl_setopt($ch,CURLOPT_RANGE,$start.'-'.$end);
  41. curl_setopt($ch,CURLOPT_BINARYTRANSFER,1);
  42. curl_setopt($ch,CURLOPT_WRITEFUNCTION,'chunk');
  43. $result = curl_exec($ch);
  44. curl_close($ch);
  45. }
  46.  
  47. //Get total size of file
  48. function get_size($url){
  49. $ch = curl_init();
  50. curl_setopt($ch,$url);
  51. curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
  52. curl_setopt($ch,CURLOPT_RETURNTRANSFER,CURLOPT_HEADER,CURLOPT_NOBODY,true);
  53. curl_exec($ch);
  54. $size = curl_getinfo($ch,CURLINFO_CONTENT_LENGTH_DOWNLOAD);
  55. return intval($size);
  56. }
  57. ?>

猜你在找的PHP相关文章