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

发布于 2024-09-07 17:06:34 字数 318 浏览 6 评论 0原文

我正在查看教程创建 ePub 文件。它规定包含 ePub 书籍的 zip 必须包含一个名为 mimetype 的文本文件,该文件“必须位于 zip 文件的第一个,未压缩”。他给出的示例使用命令行工具,我想知道如何在 PHP 中做同样的事情。

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

提前致谢。

I'm looking at a tutorial for creating an ePub file. It states that the zip that contains the ePub book must contain a textfile called mimetype that "must be first in the zip file, uncompressed". The example he gives uses a commandline tool, I was wondering how I could do the same thing in PHP.

I assume it would be first in the zip file as long as its the first thing I add in the code, but how to add it to the zip uncompressed. Or am I misreading this?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紫罗兰の梦幻 2024-09-14 17:06:41

您无法使用本机 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(...);

尽管未经测试)

You cannot do that with the native PHP ZipArchive class. But PEAR::Archive_Zip can - if you use the ARCHIVE_ZIP_PARAM_NO_COMPRESSION parameter when adding that specifc file.

A simpler solution would be to use a template. Create a stub zip file with your uncompressed "mimetype" entry (zip -0), then use that as temporary zip and afterwards just add new entries to it:

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

$zip->addFiles(...);

(untested though)

囚我心虐我身 2024-09-14 17:06:40

我目前正在使用 PHP 开发 epub 导出工具,并且使用 PCLZip 获得了良好的体验。它有一个名为 PCLZIP_OPT_NO_COMPRESSION 的选项,我在添加文件时在 add() 调用中使用该选项。我在添加 mimetype 文件时使用它,它的作用就像一个魅力。

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.

心如荒岛 2024-09-14 17:06:39

上面的 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 库”,请注意它有很多错误。我可能很快就会用这个解决方案发布修复程序,但在那之前要小心。

It seems the base64-encoded file above is a little buggy (ZipArchive refused to open it), but the following works:

// 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(...)

I tested this with my own epub-generating code and it worked fine. Epubcheck 1.05 validates it. By the way, if you're using "OPL's EPUB library", beware that it's quite buggy. I will probably post a fix to it soon with this solution baked in, but beware till then.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文