Добавление файла в zip-архив без PHP - PullRequest
4 голосов
/ 29 июня 2010

Я смотрю учебник по созданию файла ePub. В нем говорится, что zip-файл, содержащий книгу ePub, должен содержать текстовый файл с именем mimetype, который «должен быть первым в zip-файле без сжатия». В приведенном им примере используется инструмент командной строки, мне было интересно, как я могу сделать то же самое в PHP.

Я предполагаю, что он будет первым в zip-файле, если это первое, что я добавлю в код, но как добавить его в zip-файл без сжатия. Или я неправильно это понимаю?

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 02 августа 2010

Кажется, файл в кодировке 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 подтверждает это.Кстати, если вы используете «библиотеку OPUB EPUB», имейте в виду, что она довольно глючная.Вероятно, я скоро опубликую это исправление с этим решением, но будьте осторожны до тех пор.

2 голосов
/ 12 января 2011

В настоящее время я работаю над инструментом экспорта epub с использованием PHP, и у меня был хороший опыт использования PCLZip . У него есть опция PCLZIP_OPT_NO_COMPRESSION, которую я использую при вызове add () при добавлении файла. Я использую это при добавлении файла mimetype, и он работает как шарм.

1 голос
/ 29 июня 2010

Вы не можете сделать это с собственным классом PHP ZipArchive.Но PEAR :: Archive_Zip может - если вы используете параметр ARCHIVE_ZIP_PARAM_NO_COMPRESSION при добавлении этого указанного файла.

Более простым решением было бы использование шаблона.Создайте заглушку zip-файла с несжатой записью «mimetype» (zip -0), затем используйте его как временный zip-файл и добавьте в него новые записи:

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

$zip->addFiles(...);

(хотя и не проверено)

...