我正在查看创建 ePub 文件的教程。它指出包含 ePub 书籍的 zip 必须包含一个名为 mimetype 的文本文件,“必须在 zip 文件中的第一个,未压缩”。他给出的示例使用了命令行工具,我想知道如何在 PHP 中做同样的事情。
我假设它是 zip 文件中的第一个,只要它是我在代码中添加的第一件事,但是如何将它添加到未压缩的 zip 中。还是我误读了这个?
提前致谢。
上面的 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 库”,请注意它有很多错误。我可能会很快用这个解决方案发布修复它,但在那之前要小心。
I am currently working on an epub export tool using PHP and I've had a good experience using PCLZip. It has an option called PCLZIP_OPT_NO_COMPRESSION which I use on the add() call when adding a file. I use this when adding the mimetype file and it works like a charm.
您无法使用原生 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(...);
(虽然未经测试)