ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎ ссылкС ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° 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-Ρ„Π°ΠΉΠ» ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 1 note

up
1
Nitrogen ΒΆ
15 years ago
A veeery simple function to RAR files, I'm not proud of it.
Since there's no way to create RAR files in PHP (due to licensing, patents or whatever), I'm taking some advantage from the command-line RARing tool that comes with WinRAR (in the WinRAR program files named "rar.exe").

<?php
function RARFiles($Output='output.rar',$Files=array()) {
  $Data='';
  for($i=0;$i<count($Files);$i++)
    $Data.="\"{$Files[$i]}\" ";
  exec("rar.exe a \"{$Output}\" {$Data}");
}

$Files=array('file1.ext','file2.ext','file3.ext');
RARFiles('asdf.rar',$Files);
// asdf.rar created.
?>

There's no error checking, so make sure you check that your expected RAR file exists before doing anything with it.
Hopefully one day, PHP will be able to be allowed to create RAR files.