seblucas/tbszip

无需创建临时文件或需要二进制文件即可处理 zip 存档

2.16.1 2016-07-03 12:26 UTC

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)

返回存储在原始存档中的文件的 内容。如果 $Uncompresstrue,则 TbsZip 尝试在需要时解压缩内容。如果文件已压缩但 TbsZip 无法解压缩,则会引发错误。您可以使用属性 LastReadComp 检查结果是否已压缩。

FileReplace($NameOrIdx, $Data, $DataType=TBSZIP_STRING, $Compress=true)

在存档中替换或删除现有文件。将$Data=false设置为删除文件。$DataType接受TBSZIP_STRINGTBSZIP_FILE(此时$Data必须是插入外部文件的路径)。$Compress可以是truefalse或一个包含键('meth''len_u''crc32')的数组,这意味着数据已经预先压缩。注意,原始存档不会被修改,修改将在调用Flush()方法时提供为新存档。

了解当你使用外部文件(即使用选项TBSZIP_FILE)添加或替换存档中的文件时,文件内容不会立即加载到PHP内存中,非常有趣。它将在调用Flush()方法时逐个加载、压缩并输出。因此,你可以在存档中添加大量文件而不会占用PHP内存。

FileAdd($Name, $Data, $DataType=TBSZIP_STRING, $Compress=true)

在存档中添加新文件,与FileReplace()类似。注意,原始存档不会被修改,修改将在调用Flush()方法时提供为新存档。

如果$Datafalse,则取消之前添加的具有给定名称的文件(如果有的话)。

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中。在设置DisplayErrorfalse时,此属性可能非常有用,例如当使用下载选项刷新新存档时,错误消息可能被合并到下载的文件中。

Error

最后错误消息,或false表示没有TbsZip错误。当设置DisplayErrorfalse时,使用此属性来检查错误。

变更日志

版本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 链接)