示例#1
0
文件: distant.php 项目: rhertzog/lcs
/**
 * 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;
}
示例#2
0
文件: distant.php 项目: nursit/SPIP
/**
 * 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;
}
示例#3
0
/**
 * 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;
}