1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/reference/rar/examples.xml
2026-01-25 15:16:20 +00:00

177 lines
5.5 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ee741f54f831af19f135d1d9894a41477ab896c3 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="rar.examples">
&reftitle.examples;
<simpara>
Смотрите также примеры по ссылке <link linkend="wrappers.rar">обёртка <literal>rar://</literal></link>.
</simpara>
<example>
<title>Декомпрессия на лету</title>
<programlisting role="php">
<![CDATA[
<?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;
}
?>
]]>
</programlisting>
</example>
<simpara>
Этот пример открывает RAR-файл и предоставляет запрошенный файл вне RAR-архива для загрузки клиентом.
</simpara>
<example>
<title>Пример извлечения перечня файлов и директорий из RAR-архива</title>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
</example>
<simpara>
Этот пример открывает RAR-файл и извлекает каждый объект
в заданную директорию.
</simpara>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->