Php/docs/rar.examples

From Get docs

Examples

See also the examples under rar:// wrapper.

Example #1 On-the-fly decompression

<?phpif (!array_key_exists("i", $_GET) || !is_numeric($_GET["i"]))    die("Index unspecified or non-numeric");$index = (int) $_GET["i"];    $arch = RarArchive::open("example.rar");if ($arch === FALSE)    die("Cannot open example.rar");$entries = $arch->getEntries();if ($entries === FALSE)    die("Cannot retrieve entries");if (!array_key_exists($index, $entries))    die("No such index: $index");$orfilename = $entries[$index]->getName(); //UTF-8 encoded$filesize = $entries[$index]->getUnpackedSize();/* you could check HTTP_IF_MODIFIED_SINCE here and compare with * $entries[$index]->getFileTime(). You could also send a * "Last modified" header */$fp = $entries[$index]->getStream();if ($fp === FALSE)    die("Cannot open file with index $index insided the archive.");$arch->close(); //no longer needed; stream is independentfunction detectUserAgent() {    if (!array_key_exists('HTTP_USER_AGENT', $_SERVER))        return "Other";        $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 "Other";}/* * We have 3 options: * - For FF and Opera, which support RFC 2231, use that format. * - For IE and Chrome, use attwithfnrawpctenclong *   (http://greenbytes.de/tech/tc2231/#attwithfnrawpctenclong) * - For the others, convert to ISO-8859-1, if 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));//cannot send error messages from now on (headers already sent)//replace by real content type, perhaps infering from the file extension$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; //useless to send error messages      echo $s;}?>

This example opens a RAR file and presents the requested file inside the RAR archive for download to the client.

Example #2 RAR extension filesystem extraction example

<?php$rar_file = rar_open('example.rar') or die("Can't open Rar archive");$entries = rar_list($rar_file);foreach ($entries as $entry) {    echo 'Filename: ' . $entry->getName() . "\n";    echo 'Packed size: ' . $entry->getPackedSize() . "\n";    echo 'Unpacked size: ' . $entry->getUnpackedSize() . "\n";    $entry->extract('/dir/extract/to/');}rar_close($rar_file);?>

This example opens a RAR file archive and extracts each entry to the specified directory.