&reftitle.examples;
Voir aussi les exemples de la section sur le gestionnaire
rar://.
Décompression à la volée
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 d'extractions RAR
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é.