PHP Conference Japan 2024

ZipArchive::setArchiveComment

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::setArchiveComment设置ZIP归档文件的注释

描述

public ZipArchive::setArchiveComment(string $comment): bool

设置ZIP归档文件的注释。

参数

comment

注释的内容。

返回值

成功返回true,失败返回false

示例

示例 #1 创建一个归档文件并设置注释

<?php
$zip
= new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if (
$res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->setArchiveComment('new archive comment');
$zip->close();
echo
'ok';
} else {
echo
'failed';
}
?>
添加笔记

用户贡献笔记 3 条笔记

stanislav dot eckert at vizson dot de
9 年前
请注意,ZIP 归档文件不支持像 UTF-8 这样的 Unicode 编码,因此多字节字符无法在 WinRAR 或 7-zip 等标准 ZIP 查看器中显示。但是,文本将按原样存储,因此至少可以在您自己的桌面或 Web 应用程序中显示 UTF-8 注释。如果您想使用 PHP 进行测试并在浏览器中输出,请不要忘记也将页面字符集设置为 UTF-8

header("Content-Type: text/plain; charset=utf-8");
solrac at ragnarockradio dot com
8 年前
ZIP 归档文件存储时使用 ISO-8859-1 编码,但注释似乎始终以 UTF-8 添加。所以……

<?php
$zip
->setArchiveComment("Peña"); // 注释输出为 "Peña"

$zip->setArchiveComment("Peña"); // 注释输出为 "NULL" / 没有显示注释
?>

使用 mb_internal_encoding() 或 mb_http_output() 不会改变此行为。
最终可以使用类似 str_replace() 的方法修复损坏的注释。

考虑这个

<?php
$zip
= new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if (
$res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->setArchiveComment('Peña'); // 注释输出为 "Peña"
$zip->close();
$file = file_get_contents('test.zip');
file_put_contents('test.zip', str_replace("Peña", utf8_decode("Peña"), $file)); // 注释输出为 "Peña"。已修复!

echo 'ok';
} else {
echo
'failed';
}
?>
poetbi at boasoft dot cn
1 年前
ZipArchive(使用 libzip)使用 UTF-8/ASCII 编码注释,但 Windows 上的一些软件(如 WinRAR)以 ANSI(如 GBK……)显示注释,因此我们应该

<?php
$_charset
= 'GBK';
$file = 'D:/boaphp.zip';
$comment = '中文ABC123';

$zip = new ZipArchive;
$res = $zip->open($file, ZipArchive::CREATE);
if (
$res) {
// 在此处添加文件

if($_charset){ // 对于 Winrar, 7z...
$zip->close();

$str = mb_convert_encoding($comment, $_charset, 'UTF-8');
$fh = fopen($file, 'r+b');
fseek($fh, -2, SEEK_END);
$str = pack('v', strlen($str)) . $str;
fwrite($fh, $str);
fclose($fh);
}else{
// 对于 PHP: $zip->getArchiveComment()
$zip->setArchiveComment($comment);
$zip->close();
}
}
?>
To Top