Примеры

Также смотрите примеры по ссылке rar:// wrapper.

Пример #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();



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


$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));
//Невозможна дальнейшая отсылка сообщений об ошибках (заголовки уже отправлены)

//Замена на реальный 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-файл и извлекает каждый объект в указанную директорию.

To Top