将文件添加到未使用PHP解压缩的zip

时间:2010-06-29 16:44:19

标签: php zip epub

我正在查看tutorial来创建ePub文件。它声明包含ePub书的zip必须包含一个名为mimetype的文本文件,“必须首先在zip文件中,未压缩”。他给出的示例使用命令行工具,我想知道如何在PHP中做同样的事情。

我认为它首先在zip文件中,只要它是我在代码中添加的第一件事,但是如何将它添加到未压缩的zip中。或者我误读了这个?

提前致谢。

3 个答案:

答案 0 :(得分:5)

上面的base64编码文件似乎是一个小错误(ZipArchive拒绝打开它),但以下工作:

// make the archive first            
file_put_contents($fileName, base64_decode("UEsDBAoAAAAAAOmRAT1vYassFAAAABQAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi9lcHViK3ppcFBLAQIUAAoAAAAAAOmRAT1vYassFAAAABQAAAAIAAAAAAAAAAAAIAAAAAAAAABtaW1ldHlwZVBLBQYAAAAAAQABADYAAAA6AAAAAAA="));

// open archive
if (($err = $zipfile->open($fileName)) !== TRUE) {
    trigger_error("Could not open archive: " . $fileName, E_USER_ERROR);
}

$zipfile->add(...)

我使用自己的epub生成代码测试了它,它工作正常。 Epubcheck 1.05验证它。顺便说一下,如果你正在使用“OPL的EPUB库”,请注意它是非常错误的。我很可能会在解决这个问题后立即发布修复程序,但要注意这一点。

答案 1 :(得分:2)

我目前正在使用PHP进行epub导出工具,我使用PCLZip获得了很好的体验。它有一个名为PCLZIP_OPT_NO_COMPRESSION的选项,我在添加文件时使用add()调用。我在添加mimetype文件时使用它,它就像魅力一样。

答案 2 :(得分:1)

使用本机PHP ZipArchive类无法做到这一点。但是PEAR :: Archive_Zip可以 - 如果在添加该特定文件时使用ARCHIVE_ZIP_PARAM_NO_COMPRESSION参数。

更简单的解决方案是使用模板。使用未压缩的“mimetype”条目(zip -0)创建一个存根zip文件,然后将其用作临时zip,之后只需添加新条目:

file_put_contents("epub.zip", base64_decode("UEsDBAoAAAAAAOmRAT1vYassFAAAABQAAAAIABwAbWltZXR5cGVVVAkAA5adVUyQVx5PdXgLAAEE6AMAAAToAwAAYXBwbGljYXRpb24vZXB1Yit6aXBQSwECHgMKAAAAAADpkQE9b2GrLBQAAAAUAAAACAAYAAAAAAAAAAAApIEAAAAAbWltZXR5cGVVVAUAA5adVUx1eAsAAQToAwAABOgDAABQSwUGAAAAAAEAAQBOAAAAVgAAAAAA"));
$zip = new ZipArchive();
$zip->open("epub.zip");

$zip->addFiles(...);

(未经测试)