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

3
我正在查看一个用于创建ePub文件的教程。它指出包含ePub书籍的zip文件必须包含一个名为mimetype的文本文件,该文件“必须是zip文件中第一个未压缩的文件”。他给出的示例使用了一个命令行工具,我想知道如何在PHP中完成同样的操作。
我认为只要将其作为代码中添加的第一件事情,它就会成为zip文件中的第一件事情,但如何将其未压缩地添加到zip中呢?或者我是否误解了这个?
提前感谢您。
3个回答

4

看起来上面的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's EPUB library”,请注意它非常容易出现错误。我可能会很快发布一个包含此解决方案的修复程序,但在那之前请谨慎使用。


是的,这个字符串对我来说完美无缺。谢谢你。该死的,我爱StackOverflow! - Alice Wonder

2

我目前正在使用PHP开发epub导出工具,使用PCLZip的经验不错。它有一个名为PCLZIP_OPT_NO_COMPRESSION的选项,我在添加文件时使用这个选项的add()调用。当添加mimetype文件时,我使用这个选项,效果非常好。


0

使用原生的PHP ZipArchive类无法做到这一点。但是,如果您在添加特定文件时使用ARCHIVE_ZIP_PARAM_NO_COMPRESSION参数,则PEAR::Archive_Zip可以实现。

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

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

$zip->addFiles(...);

(尚未经过测试)


这个不起作用。那些新添加的文件将会使用“deflate”方法压缩。 - powerboy
没错,他们会保持不压缩。但这并不重要,因为只有MIME类型文件需要保持不压缩。 - mario
这个方向是正确的。我仍然遇到 ePub 校验器的问题,但是现在错误明确显示了 base64_decode 方法有效,我猜只需要稍微编辑一下 base64 字符串就可以了。 - Alice Wonder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接