mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
177 lines
5.5 KiB
XML
177 lines
5.5 KiB
XML
<?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
|
||
-->
|