请注意,此函数会覆盖同名的现有文件。
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)
ZipArchive::addFromString — 使用其内容将文件添加到 ZIP 档案
$name
, string $content
, int $flags
= ZipArchive::FL_OVERWRITE): bool使用其内容将文件添加到 ZIP 档案。
注意: 为了最大限度地提高可移植性,建议始终在 ZIP 文件名中使用正斜杠 (
/
) 作为目录分隔符。
name
要创建的条目的名称。
content
用于创建条目的内容。它在二进制安全模式下使用。
flags
由 ZipArchive::FL_OVERWRITE
、ZipArchive::FL_ENC_GUESS
、ZipArchive::FL_ENC_UTF_8
、ZipArchive::FL_ENC_CP437
组成的位掩码。这些常量的行为在 ZIP 常量 页面上进行了描述。
版本 | 描述 |
---|---|
8.0.0 / 1.18.0 |
flags 已添加。 |
示例 #1 将条目添加到新档案
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
示例 #2 将文件添加到档案中的目录
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->addFromString('dir/test.txt', 'file content goes here');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
在 PHP >5.4 中,此函数通常会创建 ZIP 档案中的任何子文件夹。
例如
$zip->addFromString ( 'path/to/file.txt' , $data );
除了将新创建的文件“file.txt”放入“path/to/”文件夹外,还会创建文件夹“path/”和“path/to/”。
如果你尝试
<?php
$zip->open("file", ZipArchive::CREATE);
$zip->addFromString("russian_letters/options.xml");
?>
将创建错误的目录。
如果你尝试
<?php
$zip->addEmptyDir("russian_letters");
?>
一切都会好起来的。
如果你的字符串包含阿拉伯字符,ZipArchive::addFromString 会以错误的格式显示它们。
在这种情况下,你需要将字符串编码从 Unicode 更改为 Windows-1256 编码
$filetxt = iconv('utf-8','CP1256',$filetxt);
$zip = new ZipArchive;
$zipFName = "Tmp.zip";
if ($zip->open($zipFName, ZipArchive::CREATE) === TRUE)
{
$zip->addFromString($fileName . '.csv', $filetxt);
$zip->close();
}
尽管覆盖文件后 numFiles 会改变,但当你再次 ZipArchive::close() 和 open() 时,它会恢复正常。
NULL 索引也不持久。只有新顺序会被保留。所以随意覆盖。
在这里,覆盖的工作方式与删除和添加相同。因此,不需要先使用 ZipArchive::deleteName()。
虽然此函数会替换同名文件,但实际上,原始文件会被清空并添加一个新条目。numFiles 属性会增加。
示例
文件 1:foo
文件 2:bar
$zip->addFromString('foo', 'new foo');
文件 1
文件 2:bar
文件 3:foo
ZipArchive::FL_ENC_GUESS、ZipArchive::FL_ENC_UTF_8 和 ZipArchive::FL_ENC_CP437 影响 $name 参数,而不是 $content