Примеры

Смотрите также примеры по ссылке обёртка rar://.

Пример #1 Декомпрессия на лету

<?php

if (!array_key_exists("i", $_GET) || !is_numeric($_GET["i"]))
    die("Индекс не указали или не числовой");
$index = (int) $_GET["i"];

$arch = RarArchive::open("example.rar");
if ($arch === FALSE)
    die("Невозможно открыть файл example.rar");

$entries = $arch->getEntries();
if ($entries === FALSE)
    die("Невозможно получить записи");

if (!array_key_exists($index, $entries))
    die("Нет такого индекса: $index");

$orfilename = $entries[$index]->getName(); //Кодировка UTF-8

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

/** В этом месте доступна проверка константы HTTP_IF_MODIFIED_SINCE и сравнение
 * со результатом вызова $entries[$index]->getFileTime(). Доступна также отправка заголовока
 * "Last modified"
 */

$fp = $entries[$index]->getStream();
if ($fp === FALSE)
    die("Невозможно открыть файл с индексом $index внутри архива.");

$arch->close(); // Больше не нужен. Поток независим

function 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";
}

/*
 * Действуют 3 опции:
 * - Для FF и Opera с поддержкой стандарта RFC 2231 пользуются этим форматом
 * - Для IE и Chrome формат attwithfnrawpctenclong
 *   (http://greenbytes.de/tech/tc2231/#attwithfnrawpctenclong)
 * - Для других браузеров перекодируется в набор символов ISO-8859-1, если возможно
 */
$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));
// Невозможна дальнейшая отправка сообщений об ошибках (PHP уже отправил заголовки)

// Замена на реальный Content-Type, который, возможно, получилось определить по расширению файла
$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; // В этом месте бесполезно отправлять сообщения об ошибках
    }

    echo $s;
}
?>

Этот пример открывает RAR-файл и предоставляет запрошенный файл вне RAR-архива для загрузки клиентом.

Пример #2 Пример извлечения перечня файлов и директорий из RAR-архива

<?php

$rar_file = rar_open('example.rar') or die("Невозможно открыть RAR архив");

$entries = rar_list($rar_file);

foreach ($entries as $entry) {
    echo 'Имя файла: ' . $entry->getName() . "\n";
    echo 'Упакованный размер: ' . $entry->getPackedSize() . "\n";
    echo 'Распакованный размер: ' . $entry->getUnpackedSize() . "\n";

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

rar_close($rar_file);

?>

Этот пример открывает RAR-файл и извлекает каждый объект в заданную директорию.