<?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;
}
?>