Gestion download au travers de premiumizeme
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.0 KiB

  1. <?php
  2. class DLink {
  3. /**
  4. * Telecharge le fichier
  5. *
  6. * @return array Informations sur le transfert
  7. */
  8. public static function get(Download $element)
  9. {
  10. // On le creer tout de suite pour eviter des conflits de process
  11. touch(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$element->filename);
  12. $tmpFilename = $element->_id.'-'.time();
  13. $fp = fopen(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename, 'w+');
  14. $hp = fopen(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename.'.headers', 'w+');
  15. #https://stackoverflow.com/questions/10589889/returning-header-as-array-using-curl
  16. $ch = curl_init($element->url);
  17. curl_setopt($ch, CURLOPT_FILE, $fp);
  18. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  19. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  20. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  21. curl_setopt($ch, CURLOPT_USERAGENT, USERAGENT_OUT);
  22. curl_setopt($ch, CURLOPT_WRITEHEADER, $hp);
  23. curl_exec($ch);
  24. fclose($fp);
  25. $retour = curl_getinfo($ch);
  26. // https://stackoverflow.com/questions/11842721/cant-get-remote-filename-to-file-get-contents-and-then-store-file
  27. if (curl_errno($ch)) {
  28. // TODO: gerer les erreurs
  29. }
  30. curl_close($ch);
  31. rewind($hp);
  32. $headers = stream_get_contents($hp);
  33. fclose($hp);
  34. //unlink(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename.'.header');
  35. $element->addEvent([
  36. 'state' => 'downloaded',
  37. 'curlinfo' => [
  38. 'http_code' => $retour['http_code'],
  39. 'total_time' => $retour['total_time'],
  40. 'namelookup_time' => $retour['namelookup_time'],
  41. 'connect_time' => $retour['connect_time'],
  42. 'pretransfer_time' => $retour['pretransfer_time'],
  43. 'size_download' => $retour['size_download'],
  44. 'speed_download' => $retour['speed_download'],
  45. 'starttransfer_time' => $retour['starttransfer_time']
  46. ]
  47. ]);
  48. if (200 !== $retour['http_code']) {
  49. $element->updateState('error');
  50. return false;
  51. }
  52. $element->updateState('downloaded');
  53. $realFilename = self::getRealFilename($element->url, $headers);
  54. // TODO: à adapter
  55. if (file_exists(DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$realFilename)) {
  56. $element->addEvent(['state' => 'dupp' ]);
  57. $element->updateState('dupp');
  58. // TODO: remove temp
  59. return false;
  60. }
  61. $element->updateFilename($realFilename);
  62. rename(
  63. DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename,
  64. DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$realFilename
  65. );
  66. return $retour;
  67. }
  68. public static function getRealFilename($url, $headers)
  69. {
  70. if (preg_match('/Content-Disposition: .*filename=([^ ]+)/', $headers, $matches)) {
  71. return $matches[1];
  72. }
  73. $stripped_url = preg_replace('/\\?.*/', '', $url);
  74. return basename($stripped_url);
  75. }
  76. }