2010-06-29 4 views
4

Je regarde un tutorial pour créer un fichier ePub. Il stipule que le fichier zip contenant le livre ePub doit contenir un fichier texte appelé mimetype qui "doit être le premier dans le fichier zip, non compressé". L'exemple qu'il donne utilise un outil en ligne de commande, je me demandais comment je pourrais faire la même chose en PHP.Ajouter un fichier à un fichier zip non compressé avec PHP

Je suppose qu'il serait d'abord dans le fichier zip tant que c'est la première chose que j'ajoute dans le code, mais comment l'ajouter à la fermeture éclair non compressé. Ou suis-je en train de mal interpréter cela?

Merci d'avance.

Répondre

1

Vous ne pouvez pas faire cela avec la classe native PHP ZipArchive. Mais PEAR :: Archive_Zip peut - si vous utilisez le paramètre ARCHIVE_ZIP_PARAM_NO_COMPRESSION lors de l'ajout de ce fichier specifc.

Une solution plus simple consisterait à utiliser un modèle. Créez un fichier zip stub avec votre entrée non compressée « mimetype » (zip -0), puis utiliser ce zip comme temporaire et juste ajouter après de nouvelles entrées à elle:

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

$zip->addFiles(...); 

(non testé cependant)

+0

Cela ne fonctionne pas. Ces fichiers nouvellement ajoutés seront compressés avec la méthode "deflate". – powerboy

+0

Oui. Ils vont. Ce qui n'est pas pertinent, puisque seul le fichier mimefactor doit rester non compressé. – mario

+0

Ceci est sur la bonne voie. Je reçois toujours des problèmes avec le validateur ePub mais l'erreur montre maintenant clairement la méthode base64_decode ci-dessus fonctionne, je suppose que j'ai juste besoin d'éditer la chaîne base64 un peu. –

5

Il semble le fichier codé en base64 ci-dessus est un peu buggé (ZipArchive a refusé de l'ouvrir), mais les travaux suivants:

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

J'ai testé avec mon propre code de génération de epub et il a bien fonctionné. Epubcheck 1.05 le valide. En passant, si vous utilisez la "bibliothèque EPUB de l'OPL", sachez que c'est assez bogué. Je vais probablement poster un correctif bientôt avec cette solution cuite, mais méfiez-vous jusque-là.

+0

Tout comme epubcheck 1.2 - il semble que ce soit le meilleur pari pour l'instant ... – Izkata

+0

Oui, cette chaîne fonctionne parfaitement pour moi. Je vous remercie. Merde j'adore StackOverflow! –

2

Je travaille actuellement sur un outil d'exportation epub en utilisant PHP et j'ai eu une bonne expérience en utilisant PCLZip. Il a une option appelée PCLZIP_OPT_NO_COMPRESSION que j'utilise sur l'appel add() lors de l'ajout d'un fichier. Je l'utilise lors de l'ajout du fichier mimetype et cela fonctionne comme un charme.

Questions connexes