Exemples

Voir aussi les exemples de la section sur le gestionnaire rar://.

Exemple #1 Décompression à la volée

<?php

if (!array_key_exists("i", $_GET) || !is_numeric($_GET["i"]))
	die("Index non spécifié ou non numérique");
$index = (int) $_GET["i"];
	
$arch = RarArchive::open("example.rar");
if ($arch === FALSE)
	die("Impossible d'ouvrir example.rar");

$entries = $arch->getEntries();
if ($entries === FALSE)
	die("Impossible de récupérer les entrées");

if (!array_key_exists($index, $entries))
	die("L'index $index n'existe pas");

$orfilename = $entries[$index]->getName(); //Encodage UTF-8

$filesize = $entries[$index]->getUnpackedSize();

/* Vous pouvez vérifier ici HTTP_IF_MODIFIED_SINCE et le comparer
 * avec $entries[$index]->getFileTime(). Vous pouvez également envoyer
 * un en-tête "Last modified" */

$fp = $entries[$index]->getStream();
if ($fp === FALSE)
	die("Impossible d'ouvrir le fichier d'index $index depuis l'archive.");

$arch->close(); //plus nécessaire ; le flux est indépendant

function detectUserAgent() {
	if (!array_key_exists('HTTP_USER_AGENT', $_SERVER))
		return "Autre";
	
	$uas = $_SERVER['HTTP_USER_AGENT'];
	if (preg_match("@Opera/@", $uas))
		return "Opera";
	if (preg_match("@Firefox/@", $uas))
		return "Firefox";
	if (preg_match("@Chrome/@", $uas))
		return "Chrome";
	if (preg_match("@MSIE ([0-9.]+);@", $uas, $matches)) {
		if (((float)$matches[1]) >= 7.0)
			return "IE";
	}
	
	return "Autre";
}

/*
 * Nous avons 3 options :
 * - Pour FF et Opera, qui supportent RFC 2231, utilisez ce format.
 * - Pour IE et Chrome, utilisez attwithfnrawpctenclong
 *   (http://greenbytes.de/tech/tc2231/#attwithfnrawpctenclong)
 * - Pour les autres, convertissez en ISO-8859-1, si possible
 */
$formatRFC2231 = 'Content-Disposition: attachment; filename*=UTF-8\'\'%s';
$formatDef = 'Content-Disposition: attachment; filename="%s"';

switch (detectUserAgent()) {
	case "Opera":
	case "Firefox":
		$orfilename = rawurlencode($orfilename);
		$format = $formatRFC2231;
		break;

	case "IE":
	case "Chrome":
		$orfilename = rawurlencode($orfilename);
		$format = $formatDef;
		break;
	default:
		if (function_exists('iconv'))
			$orfilename =
				@iconv("UTF-8", "ISO-8859-1//TRANSLIT", $orfilename);
		$format = $formatDef;
}

header(sprintf($format, $orfilename));
// Impossible d'envoyer les messages d'erreur à partir d'ici (les en-têtes
// ont déjà été émis)

// Remplacement par le type de contenu réel, pourquoi pas par déduction de l'extension du fichier
$contentType = "application/octet-stream";
header("Content-Type: $contentType");

header("Content-Transfer-Encoding: binary");

header("Content-Length: $filesize");

if ($_SERVER['REQUEST_METHOD'] == "HEAD")
	die();
	
while (!feof($fp)) {
	$s = @fread($fp, 8192);
	if ($s === false)
		break; //utile pour envoyer des messages d'erreur
  
	echo $s;
}
?>

Cet exemple ouvre l'archive RAR et extrait chacune des entrées dans un dossier spécifié.

Exemple #2 Exemple d'extractions RAR

<?php

$rar_file = rar_open('example.rar') or die("Can't open Rar archive");

$entries = rar_list($rar_file);

foreach ($entries as $entry) {
	echo 'Nom du fichier : ' . $entry->getName() . "\n";
	echo 'Taille de l'archive : ' . $entry->getPackedSize() . "\n";
	echo 'Taille après décompression : ' . $entry->getUnpackedSize() . "\n";

	$entry->extract('/dir/extract/to/');
}

rar_close($rar_file);

?>

Cet exemple ouvre une archive RAR et extrait chaque entrée dans le dossier spécifié.

LoadingChargement en cours