/** * Cree au besoin la copie locale d'un fichier distant * * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * http://doc.spip.org/@copie_locale * * @param $source * @param string $mode * 'test' - ne faire que tester * 'auto' - charger au besoin * 'modif' - Si deja present, ne charger que si If-Modified-Since * 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @return bool|string */ function copie_locale($source, $mode='auto') { // si c'est la protection de soi-meme, retourner le path if ($mode !== 'force' AND preg_match(_REGEXP_COPIE_LOCALE, $source, $local)) { $source = substr(_DIR_IMG,strlen(_DIR_RACINE)) . urldecode($local[1]); return @file_exists($source) ? $source : false; } $local = fichier_copie_locale($source); $localrac = _DIR_RACINE.$local; $t = ($mode=='force') ? false : @file_exists($localrac); // test d'existence du fichier if ($mode=='test') return $t ? $local : ''; // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) return false; // sinon voir si on doit/peut le telecharger if ($local==$source OR !preg_match(',^\w+://,', $source)) return $local; if ($mode=='modif' OR !$t){ // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); $localractmp = "$localrac.".creer_uniqid().".tmp"; $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); if ($res) { // si OK on supprime l'ancien fichier et on renomme spip_log("copie_locale : recuperation $source sur $localractmp taille $res OK, renommage en $localrac"); spip_unlink($localrac); @rename($localractmp, $localrac); } else { // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... spip_log("copie_locale : Echec recuperation $source sur $localractmp, fichier supprime",_LOG_INFO_IMPORTANTE); spip_unlink($localractmp); } if (!$res) return $t ? $local : false; // pour une eventuelle indexation pipeline('post_edition', array( 'args' => array( 'operation' => 'copie_locale', 'source' => $source, 'fichier' => $local ), 'data' => null ) ); } return $local; }
/** * Cree au besoin la copie locale d'un fichier distant * * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * http://doc.spip.org/@copie_locale * * @param $source * @param string $mode * 'test' - ne faire que tester * 'auto' - charger au besoin * 'modif' - Si deja present, ne charger que si If-Modified-Since * 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @return bool|string */ function copie_locale($source, $mode = 'auto', $local = null) { // si c'est la protection de soi-meme $reg = ',' . $GLOBALS['meta']['adresse_site'] . "/?spip.php[?]action=acceder_document.*file=(.*)\$,"; if (preg_match($reg, $source, $m)) { return substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($m[1]); } if (is_null($local)) { $local = fichier_copie_locale($source); } else { if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { $local = substr($local, strlen(_DIR_RACINE)); } } $localrac = _DIR_RACINE . $local; $t = $mode == 'force' ? false : @file_exists($localrac); // test d'existence du fichier if ($mode == 'test') { return $t ? $local : ''; } // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) { return false; } // sinon voir si on doit/peut le telecharger if ($local == $source or !preg_match(',^\\w+://,', $source)) { return $local; } if ($mode == 'modif' or !$t) { // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); $localractmp = "{$localrac}." . creer_uniqid() . ".tmp"; $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); if ($res) { // si OK on supprime l'ancien fichier et on renomme spip_log("copie_locale : recuperation {$source} sur {$localractmp} taille {$res} OK, renommage en {$localrac}"); spip_unlink($localrac); @rename($localractmp, $localrac); } else { // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... spip_log("copie_locale : Echec recuperation {$source} sur {$localractmp}, fichier supprime", _LOG_INFO_IMPORTANTE); spip_unlink($localractmp); } if (!$res) { return $t ? $local : false; } // pour une eventuelle indexation pipeline('post_edition', array('args' => array('operation' => 'copie_locale', 'source' => $source, 'fichier' => $local), 'data' => null)); } return $local; }
/** * Crée au besoin la copie locale d'un fichier distant * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * @link http://www.spip.net/4155 * @pipeline_appel post_edition * * @param string $source * @param string $mode * - 'test' - ne faire que tester * - 'auto' - charger au besoin * - 'modif' - Si deja present, ne charger que si If-Modified-Since * - 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @param int $taille_max * taille maxi de la copie local, par defaut _COPIE_LOCALE_MAX_SIZE * @return bool|string */ function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null) { // si c'est la protection de soi-meme, retourner le path if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); return @file_exists($source) ? $source : false; } if (is_null($local)) { $local = fichier_copie_locale($source); } else { if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { $local = substr($local, strlen(_DIR_RACINE)); } } // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) { return false; } $localrac = _DIR_RACINE . $local; $t = $mode == 'force' ? false : @file_exists($localrac); // test d'existence du fichier if ($mode == 'test') { return $t ? $local : ''; } // sinon voir si on doit/peut le telecharger if ($local == $source or !tester_url_absolue($source)) { return $local; } if ($mode == 'modif' or !$t) { // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); if (!$taille_max) { $taille_max = _COPIE_LOCALE_MAX_SIZE; } $res = recuperer_url($source, array('file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '')); if (!$res or !$res["length"] and $res["status"] != 304) { spip_log("copie_locale : Echec recuperation {$source} sur {$localrac} status : " . $res["status"], _LOG_INFO_IMPORTANTE); } if (!$res['length']) { // si $t c'est sans doute juste un not-modified-since return $t ? $local : false; } spip_log("copie_locale : recuperation {$source} sur {$localrac} taille " . $res['length'] . " OK"); // pour une eventuelle indexation pipeline('post_edition', array('args' => array('operation' => 'copie_locale', 'source' => $source, 'fichier' => $local, 'http_res' => $res['length']), 'data' => null)); } return $local; }