seblucas / tbszip
无需创建临时文件或需要二进制文件即可处理 zip 存档
Requires
- php: >=5.3.0
- ext-zlib: *
Requires (Dev)
- phpunit/phpunit: 5.4.*
This package is not auto-updated.
Last update: 2024-09-26 21:26:10 UTC
README
版本 2.16,2014-04-08,作者 Skrol29
文档更新于 2014-04-08
简介
TbsZip 是一个 PHP 类,可以读取 zip 存档,甚至可以编辑存档中的子文件,然后创建新的存档。它无需任何临时文件即可工作。虽然此类与其它库无关,但它最初是为 OpenTBS 项目创建的,这是一个为 TinyButStrong 模板引擎的插件。OpenTBS 使 TinyButStrong 能够使用模板技术构建 OpenOffice 和 Ms Office 文档。
TbsZip 在 PHP5 下开发,但应与 PHP4 兼容。
查看 OpenTBS 示例。
查看其他 TinyButStrong 插件。
功能
- 可以读取常见的 zip 存档,或从一个空存档开始
- 可以修改存档中文件的 内容(替换、删除或添加新文件)
- 新文件的内容可以来自 PHP 字符串,或来自外部物理文件
- 修改后的存档可以发布为新的物理文件、HTTP 下载或 PHP 字符串
- 原始存档不会被修改
- 该类不使用临时文件:当新的存档被刷新时,原始存档中未修改的部分会直接从原始存档中流式传输,修改过的部分会从其来源(外部物理文件或 PHP 字符串)流式传输
限制
- 不支持 Zip64 存档
- 不支持 zip 文件注释(很少使用,在 7-Zip 中尚不可编辑)
- 仅需要 Zlib 扩展 来压缩或解压缩存档中的文件(Zlib 在大多数 PHP 安装中通常是可用的)
示例
$zip = new clsTbsZip(); // instantiate the class $zip->Open('archive1.zip'); // open an existing zip archive $ok = $zip->FileExists('innerfolder/subfile1.txt'); // check if a sub-file exist in the archive $txt = $zip->FileRead('subfile2.txt'); // retrieve the content of a sub-file ... // some work on the $txt contents $zip->FileReplace('subfile2.txt', $txt, TBSZIP_STRING); // replace the existing sub-file $zip->FileReplace('subfile3.txt', false); // delete the existing sub-file $zip->FileAdd('subfile4.txt', $txt3, TBSZIP_STRING); // add a new sub-file $zip->Flush(TBSZIP_FILE, 'archive1_new.zip'); // flush the modifications as a new archive $zip->Close(); // close the current archive
概述
类名: clsTbsZip
Open($ArchFile, $UseIncludePath=false)
打开原始 Zip 存档(可以是 LibreOffice 文档、MS Office 文档或任何其他 Zip 存档)。
版本控制
- 自 TbsZip 版本 2.14 以来,$ArchFile 可以是 PHP 文件句柄
- 自 TbsZip 版本 2.12 以来支持
$UseIncludePath
参数
CreateNew()
创建一个新的空 Zip 存档。新的存档在 PHP 内存中虚拟准备,此时没有写入任何内容。当您使用 CreateNew()
创建新存档时,不能使用 FileExists()
、FileRead()
和 FileReplace()
方法,因为存档是空的。
版本控制
CreateNew()
方法自 TbsZip 版本 2.1 支持
FileExists($NameOrIdx)
如果原始存档中存在文件,则返回 true
。$NameOrIdx
必须是包含在存档中的完整名称(包括存档中的文件夹名称)或现有文件的索引。
FileRead($NameOrIdx, $Uncompress=true)
返回存储在原始存档中的文件的 内容。如果 $Uncompress
为 true
,则 TbsZip 尝试在需要时解压缩内容。如果文件已压缩但 TbsZip 无法解压缩,则会引发错误。您可以使用属性 LastReadComp
检查结果是否已压缩。
FileReplace($NameOrIdx, $Data, $DataType=TBSZIP_STRING, $Compress=true)
在存档中替换或删除现有文件。将$Data=false
设置为删除文件。$DataType
接受TBSZIP_STRING
和TBSZIP_FILE
(此时$Data
必须是插入外部文件的路径)。$Compress
可以是true
、false
或一个包含键('meth'
、'len_u'
、'crc32'
)的数组,这意味着数据已经预先压缩。注意,原始存档不会被修改,修改将在调用Flush()
方法时提供为新存档。
了解当你使用外部文件(即使用选项TBSZIP_FILE
)添加或替换存档中的文件时,文件内容不会立即加载到PHP内存中,非常有趣。它将在调用Flush()
方法时逐个加载、压缩并输出。因此,你可以在存档中添加大量文件而不会占用PHP内存。
FileAdd($Name, $Data, $DataType=TBSZIP_STRING, $Compress=true)
在存档中添加新文件,与FileReplace()
类似。注意,原始存档不会被修改,修改将在调用Flush()
方法时提供为新存档。
如果$Data
为false
,则取消之前添加的具有给定名称的文件(如果有的话)。
FileCancelModif($NameOrIdx)
取消存档中给定文件名的添加、删除和替换。返回取消的数量。
FileGetState($NameOrIdx)
返回表示存档中文件状态的字符串。
Flush($Render=TBSZIP_DOWNLOAD, $File='', $ContentType='')
实际上创建新的存档,包含所有修改。在此过程中将加载要插入的外部子文件,而不是之前。它们将逐个动态压缩并输出,不会留在PHP内存中。不使用临时文件。
Debug()
显示原始存档的信息。
Close()
关闭已打开的原始存档。
ArchFile
已打开原始存档的完整路径。
CdFileLst
一个数组,列出了原始存档中所有现有文件及其一些技术信息。
LastReadIdx
FileRead()
最后读取的文件的索引。false
表示文件在存档中未找到。
LastReadComp
FileRead()
最后读取的文件的压缩信息。
false
表示文件在存档中未找到。-1
表示文件已压缩并已成功解压缩。0
表示文件未压缩。1
表示文件已压缩,但TbsZip无法解压缩。
DisplayError
默认值在版本2.3之前为false
,从版本2.4开始为true
。
如果值为true
,则显示TbsZip错误消息(使用echo
)。
在任何情况下,最后一个TbsZip错误消息都保存到属性Error
中。在设置DisplayError
为false
时,此属性可能非常有用,例如当使用下载选项刷新新存档时,错误消息可能被合并到下载的文件中。
Error
最后错误消息,或false
表示没有TbsZip错误。当设置DisplayError
为false
时,使用此属性来检查错误。
变更日志
版本2.16,日期:2014-04-08
- 错误修复:无法下载与打开的存档具有相同名称的文件。
版本2.15,日期:2013-10-15
- 现在TbsZip可以打开带注释的存档。
- 在CLI模式下为PHP提供更清晰的错误消息。
- 为与OpenTBS的连接提供更清晰的错误消息。
版本2.14,日期:2013-06-11
- 可以打开来自PHP文件句柄的存档。
版本2.13,日期:2013-04-14
- 新方法
FileGetState()
。
版本2.12,日期:2013-03-16
- 错误修复:当原始存档使用没有签名的数据描述符时,可能会生成损坏的存档。
- 小改进:新参数
$UseIncludePath
。 - 小改进:调试模式更智能。
版本 2.11,日期:2011-02-14
- 修复了 bug:方法
FileCancelModif()
无法取消已添加的文件。
版本 2.10,日期:2011-08-13
- 修复了 bug:在删除文件而没有添加任何文件时,发生 PHP 警告 "Notice: Undefined variable: AddDataLen..."。
版本 2.9,日期:2011-07-22
- 修复了 bug:当请求的文件不存在时,在
FileRead()
上存在一个小的 bug。
版本 2.8,日期:2011-06-08
- 修复了 bug:在关闭存档两次时,可能会发生 PHP 警告 "Warning: fclose(): 10 is not a valid stream resource"。
版本 2.7,日期:2011-06-07
- 修复了 bug:当使用方法
Flush()
时,可能会发生 PHP 错误 "supplied argument is not a valid stream resource" 或 "Undefined property: clsOpenTBS::$OutputHandle"。
版本 2.6,日期:2011-06-07
- 轻微增强:现在如果
Flush()
尝试覆盖一个已锁定的文件,则引发 TbsZip 错误。
版本 2.5,日期:2011-05-12
- 修复了轻微的 bug:与 PHP 5 紧密兼容(无 E_STRICT 错误报告的 PHP 警告)
版本 2.4,日期:2011-03-25
- 修复了轻微的 bug:使用
Flush()
创建的新存档在刷新结束时未解锁。clsTbsZip 实例仍然持有它的句柄。 - 轻微增强:现在如果
Flush()
尝试覆盖当前存档,则引发 TbsZip 错误。 - 轻微增强:属性
DisplayError
默认设置为 true。
版本 2.3,日期:2010-11-29
- 修复了轻微的 bug:使用
CreateNew()
和Flush(TBSZIP_DOWNLOAD)
两种方法创建的存档可能会被截断,因为存档的最终大小估计不准确。
版本 2.2,日期:2010-10-28
- 修复了严重的 bug:某些添加或修改的文件可能以错误的 CRC 控制代码保存到存档中。这可能导致软件将文件或存档视为损坏。只有少数 CRC 代码被错误保存,因此此错误很少见,似乎随机出现。
版本 2.1,日期:2010-07-01
- 修复了 bug:在存档中添加新文件时,文件的时间是错误的(日期是正确的)
- TbsZip 现在在替换文件内容时更改存档中文件的时间和日期
- 新方法
CreateNew()
联系和信息
作者:[Skrol29](http://www.tinybutstrong.com/onlyyou.html)(无 follow、noindex、noopen、external ugc 链接)
许可证:[LGPL](https://gnu.ac.cn/licenses/lgpl.html)(无 follow、noindex、noopen、external ugc 链接)