|
|
<?php
class DLink {
/** * Telecharge le fichier * * @return array Informations sur le transfert */ public static function get(Download $element) { // On le creer tout de suite pour eviter des conflits de process
touch(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$element->filename);
$tmpFilename = $element->_id.'-'.time();
$fp = fopen(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename, 'w+'); $hp = fopen(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename.'.headers', 'w+'); #https://stackoverflow.com/questions/10589889/returning-header-as-array-using-curl
$ch = curl_init($element->url);
curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_USERAGENT, USERAGENT_OUT); curl_setopt($ch, CURLOPT_WRITEHEADER, $hp); curl_exec($ch); fclose($fp); $retour = curl_getinfo($ch);// https://stackoverflow.com/questions/11842721/cant-get-remote-filename-to-file-get-contents-and-then-store-file
if (curl_errno($ch)) { // TODO: gerer les erreurs
} curl_close($ch); rewind($hp); $headers = stream_get_contents($hp); fclose($hp); //unlink(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename.'.header');
$element->addEvent([ 'state' => 'downloaded', 'curlinfo' => [ 'http_code' => $retour['http_code'], 'total_time' => $retour['total_time'], 'namelookup_time' => $retour['namelookup_time'], 'connect_time' => $retour['connect_time'], 'pretransfer_time' => $retour['pretransfer_time'], 'size_download' => $retour['size_download'], 'speed_download' => $retour['speed_download'], 'starttransfer_time' => $retour['starttransfer_time'] ] ]);
if (200 !== $retour['http_code']) { $element->updateState('error'); return false; } $element->updateState('downloaded'); $realFilename = self::getRealFilename($element->url, $headers);
// TODO: à adapter
if (file_exists(DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$realFilename)) { $element->addEvent(['state' => 'dupp' ]); $element->updateState('dupp'); // TODO: remove temp
return false; }
$element->updateFilename($realFilename); rename( DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$tmpFilename, DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$realFilename ); return $retour; } public static function getRealFilename($url, $headers) { if (preg_match('/Content-Disposition: .*filename=([^ ]+)/', $headers, $matches)) { return $matches[1]; } $stripped_url = preg_replace('/\\?.*/', '', $url); return basename($stripped_url); }
}
|