示例

另请参阅 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() 进行比较。 你也可以发送一个
* "最后修改" 头 */

$fp = $entries[$index]->getStream();
if (
$fp === FALSE)
die(
"无法打开存档中索引为 $index 的文件。");

$arch->close(); //不再需要;流是独立的

function detectUserAgent() {
if (!
array_key_exists('HTTP_USER_AGENT', $_SERVER))
return
"其他";

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

/*
* 我们有 3 个选项:
* - 对于支持 RFC 2231 的 FF 和 Opera,使用该格式。
* - 对于 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));
//从此以后无法发送错误消息(头文件已发送)

//用真实的 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 个注释

1
Nitrogen
13 年前
一个非常简单的 RAR 文件函数,我对此并不感到自豪。
由于 PHP 中无法创建 RAR 文件(由于许可、专利或其他原因),因此我利用了 WinRAR 附带的命令行 RAR 工具(位于 WinRAR 程序文件中名为“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 文件。
?>

此函数没有错误检查,因此请确保在使用 RAR 文件之前检查其是否存在。
希望有一天,PHP 可以创建 RAR 文件。
To Top